Prolog:为什么 member/2 在这里不能正常工作?
Prolog: Why is member/2 not working properly here?
我遇到了一个有趣的问题:
在我的代码中,[R|Rs]
是通过从 SortedRanks
中删除 Seq
生成的列表的其余部分。它将包含 1 或 2 个元素。数量取决于Seq
的长度,Length
可以是3或4。
如果长度为4,[R|Rs]
只有一个元素;
如果长度为 3,[R|Rs]
将有两个元素。
然而,当长度为 3 时,我尝试使用 member/2
来查找 Rs
(我认为是 [R|Rs]
中的最后一个元素)是否在 Seq
,即使里面有Rs
,member/2/
returns false。我在这里真的很困惑。
以下是我的代码:
calculate_run( SortedRanks, Seq, [R|Rs], Length, Seq ) :-
remove_list(SortedRanks, Seq, [R|Rs]),
( Length = 4 ->
( member(R,Seq) -> Number is 2 ; Number is 1 )
;
( member(R,Seq) ->
( member(Rs,Seq) ->
( R =:= Rs ->
Number is 3
;
Number is 4
)
;
Number is 2
)
;
( member(Rs,Seq) ->
Number is 2
;
Number is 1
)
)
),
Points is Length * Number .
主要问题是member(Rs,Seq)
没有返回正确的布尔值。我是 prolog 的新手,是的,我承认这不是一个优雅的解决方案,但这是我现在能做的最好的。
没有任何例子我无法判断你在做什么,但我怀疑“即使里面有 Rs”是不准确的;我猜你的问题是在 [R|Rs]
中,Rs 是一个列表而不是一个元素。
If the length is 4, [R|Rs] would only have one element
与单元素列表统一:[R|Rs] = [5]
和 R=5
和 Rs=[]
。
If the length is 3, [R|Rs] would have two elements.
统一两个元素列表:[R|Rs]=[5,6]
和 R=5
和 Rs=[6]
而不是 Rs=6
。
例如
?- [R|Rs] = [1,2],
member(Rs, [1,2,3]).
false
因为 [2]
不是 [1,2,3]
的成员。
?- [R|Rs]=[1,2],
member(Rs, [1,[2],3]).
R = 1,
Rs = [2]
因为[2]
是[1,[2],3]
的成员。
我遇到了一个有趣的问题:
在我的代码中,[R|Rs]
是通过从 SortedRanks
中删除 Seq
生成的列表的其余部分。它将包含 1 或 2 个元素。数量取决于Seq
的长度,Length
可以是3或4。
如果长度为4,[R|Rs]
只有一个元素;
如果长度为 3,[R|Rs]
将有两个元素。
然而,当长度为 3 时,我尝试使用 member/2
来查找 Rs
(我认为是 [R|Rs]
中的最后一个元素)是否在 Seq
,即使里面有Rs
,member/2/
returns false。我在这里真的很困惑。
以下是我的代码:
calculate_run( SortedRanks, Seq, [R|Rs], Length, Seq ) :-
remove_list(SortedRanks, Seq, [R|Rs]),
( Length = 4 ->
( member(R,Seq) -> Number is 2 ; Number is 1 )
;
( member(R,Seq) ->
( member(Rs,Seq) ->
( R =:= Rs ->
Number is 3
;
Number is 4
)
;
Number is 2
)
;
( member(Rs,Seq) ->
Number is 2
;
Number is 1
)
)
),
Points is Length * Number .
主要问题是member(Rs,Seq)
没有返回正确的布尔值。我是 prolog 的新手,是的,我承认这不是一个优雅的解决方案,但这是我现在能做的最好的。
没有任何例子我无法判断你在做什么,但我怀疑“即使里面有 Rs”是不准确的;我猜你的问题是在 [R|Rs]
中,Rs 是一个列表而不是一个元素。
If the length is 4, [R|Rs] would only have one element
与单元素列表统一:[R|Rs] = [5]
和 R=5
和 Rs=[]
。
If the length is 3, [R|Rs] would have two elements.
统一两个元素列表:[R|Rs]=[5,6]
和 R=5
和 Rs=[6]
而不是 Rs=6
。
例如
?- [R|Rs] = [1,2],
member(Rs, [1,2,3]).
false
因为 [2]
不是 [1,2,3]
的成员。
?- [R|Rs]=[1,2],
member(Rs, [1,[2],3]).
R = 1,
Rs = [2]
因为[2]
是[1,[2],3]
的成员。