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
表示术语不平等即使使用非地面条件,也可以保留。