语句语法的基本prolog问题

时间:2014-05-03 14:51:36

标签: prolog

我是Prolog的初学者,我有一个简单的问题。我写了一个sister_of/2谓词,如下所示:

sister_of(X, Y) :-
    female(X),
    parents(X, Z, W) == parents(Y,Z,W),
    X \= Y.

我读到这个,因为X是Y的姐妹,如果X是女性,X的父母是Z W,Y的父母,Z W和X和Y不是同一个人。这不是出于某种原因运行,所以它必须是一个语法问题,一些洞察力将是太棒了。谢谢。

2 个答案:

答案 0 :(得分:2)

Prolog不是功能性语言,它是关系语言。您定义谓词(即关系),而不是函数。因此,您的parents(X, Z, W) == parents(Y,Z,W)只是比较两个术语parents(X, Z, W)parents(Y,Z,W)的相等性。假设还定义了parents/3谓词,您需要以下内容:

sister_of(X, Y) :-
    female(X),
    parents(X, Z, W),
    parents(Y, Z, W),
    X \= Y.

答案 1 :(得分:1)

嗯,你开始构建推理好了,但在比较中失败了。这是你错过的:

sister_of(X, Y) :-
    female(X),
    parents(X, Z, W),
    parents(Y, Z, W),
    X \= Y.

现在的推理如下:

  1. XY;
  2. 的姐妹
  3. 如果X是女性;
  4. 如果X有父母ZW;
  5. 如果Y有父母ZW;
  6. 当然,X不是Y,因此X不是自己的姐妹。
  7. 请注意,您之前执行的比较不是必需的(事实上,并不代表您的预期),因为ZW仅限于{{1}的父母在步骤3中,这意味着XZ在步骤3之后已经有了一个确定的值 - 换句话说,它们是绑定的。

    之后,在第4步中,W只能假定Y的相同值,或者使X为真的其他值。最后,删除步骤5中parents(Y, Z, W)的案例,为您提供X == Y的有效定义。