【发布时间】:2015-06-23 16:56:34
【问题描述】:
member(K,[a,b,c,d]) 如果是...
两个...的声明是什么?
【问题讨论】:
-
你将不得不澄清一下这个问题。
-
在这个答案下查看我的评论:stackoverflow.com/questions/1939054/…
标签: prolog
member(K,[a,b,c,d]) 如果是...
两个...的声明是什么?
【问题讨论】:
标签: prolog
只需冲洗并重复:
?- List = [a,b,c,d],member(X,List),member(Y,List).
如果你想要两个不同的元素,那么,
?- List = [a,b,c,d],member(X,List),member(Y,List),X \== Y.
如果这就是你所追求的,那么将它包装在一个谓词中:
two_members(X,Y,List) :-
member(X,List),
member(Y,List),
X \== Y.
【讨论】:
dif/2 来表达术语不等式,即使在使用非基本术语时,您也可以保留logical-purity。
我对谓词 two_members/3 的预期语义的解释略有不同:
X和Y从给定列表Ls。Ls 必须至少有两个列表项,two_members/3 才能成功。Ls 至少包含两次X,X 和 Y 可能相等。基于我们定义的内置谓词select/3 和member/2:
two_members(X,Y,Ls) :-
select(X,Ls,Ls0),
member(Y,Ls0).
让我们运行一些查询!首先,问题中OP建议的查询:
?- two_members(X,Y,[a,b,c,d]).
X = a, Y = b ;
X = a, Y = c ;
X = a, Y = d ;
X = b, Y = a ;
X = b, Y = c ;
X = b, Y = d ;
X = c, Y = a ;
X = c, Y = b ;
X = c, Y = d ;
X = d, Y = a ;
X = d, Y = b ;
X = d, Y = c ;
false.
如果某些项目在Ls 中出现多次怎么办?
?- two_members(X,Y,[a,a,b]).
X = a, Y = a ;
X = a, Y = b ;
X = a, Y = a ; % redundant answer
X = a, Y = b ; % redundant answer
X = b, Y = a ;
X = b, Y = a ; % redundant answer
false.
以上多余的答案呢?它们来自哪里,我们可以避免它们吗?
多余的答案来自select/3和member/3:
?- select(X,[a,a,b],Xs).
X = a, Xs = [a,b] ;
X = a, Xs = [a,b] ; % redundant answer
X = b, Xs = [a,a] ;
false.
?- member(X,[a,a,b]).
X = a ;
X = a ; % redundant answer
X = b.
为了摆脱这些冗余,我们可以使用
memberd/2 而不是 member/2 和
selectd/3 而不是 select/3。让我们再次运行上面的查询:
多余的答案不见了!所以让我们相应地重新定义two_members/3:
这是上面对two_members/3 的查询,曾经给出了这些多余的答案:
?- two_members(X,Y,[a,a,b]).
X = a, Y = a ;
X = a, Y = b ;
X = b, Y = a ;
false. % all of above redundant answers have gone!
【讨论】: