【问题标题】:Prolog statement syntaxProlog 语句语法
【发布时间】:2015-06-23 16:56:34
【问题描述】:

member(K,[a,b,c,d]) 如果是...

两个...的声明是什么?

【问题讨论】:

标签: prolog


【解决方案1】:

只需冲洗并重复:

?- 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
【解决方案2】:

我对谓词 two_members/3 的预期语义的解释略有不同:

  • 我们想绘制项目XY从给定列表Ls
  • Ls 必须至少有两个列表项,two_members/3 才能成功。
  • 如果Ls 至少包含两次XXY 可能相等。

基于我们定义的内置谓词select/3member/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/3member/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/2selectd/3 而不是 select/3。让我们再次运行上面的查询:

?- 选择d(X,[a,a,b],Xs)。 X = a, Xs = [a,b] ; X = b, Xs = [a,a] ; 错误的。 ?- 成员d(X,[a,a,b])。 X = 一个; X = 乙; 错误的。

多余的答案不见了!所以让我们相应地重新定义two_members/3

两个成员(X,Y,Ls):- 选择d(X,Ls,Ls0), 成员d(Y,Ls0)。

这是上面对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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多