Prolog语句语法
Prolog语句语法,prolog,Prolog,成员(K[a,b,c,d])如果为以下其中一个成员: 以下两种说法是什么?只需冲洗并重复: ?- 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
成员(K[a,b,c,d])
如果为以下其中一个成员:
以下两种说法是什么?只需冲洗并重复:
?- 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.
只需冲洗并重复:
?- 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.
我对谓词
two_members/3
的预期语义的解释有些不同:
- 我们想从给定的列表
中绘制项目Ls
和X
Y
必须至少有两个列表项才能使Ls
成功两个成员/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.
为了消除这些冗余,我们可以使用
而不是成员/2
和
而不是选择/3
。让我们再次运行上述查询:
?- selectd(X,[a,a,b],Xs).
X = a, Xs = [a,b] ;
X = b, Xs = [a,a] ;
false.
?- memberd(X,[a,a,b]).
X = a ;
X = b ;
false.
下面是对两名成员/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!
我对谓词
two_members/3
的预期语义的解释有些不同:
- 我们想从给定的列表
中绘制项目Ls
和X
Y
必须至少有两个列表项才能使Ls
成功两个成员/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.
为了消除这些冗余,我们可以使用
而不是成员/2
和
而不是选择/3
。让我们再次运行上述查询:
?- selectd(X,[a,a,b],Xs).
X = a, Xs = [a,b] ;
X = b, Xs = [a,a] ;
false.
?- memberd(X,[a,a,b]).
X = a ;
X = b ;
false.
下面是对两名成员/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!
你必须稍微澄清一下这个问题。请参阅我在这个答案下的评论:你必须稍微澄清一下这个问题。请参阅我在这个答案下的评论:使用
dif/2
表示术语不平等,即使在使用非基本术语时,你也可以保留。使用dif/2
表示术语不平等即使使用非地面条件,也可以保留。