带有语句语法的基本prolog问题

带有语句语法的基本prolog问题,prolog,Prolog,我是一个初学者,我有一个快速的问题。我写了一个/2的姐妹谓词,如下所示: sister_of(X, Y) :- female(X), parents(X, Z, W) == parents(Y,Z,W), X \= Y. 我读这篇文章是因为X是Y的姐妹,如果X是女性,X的父母是Z,Z,W,X和Y不是同一个人。不过,由于某种原因,它没有运行,所以它一定是一个语法问题,一些见解将是非常棒的。多谢各位 Prolog不是函数式语言,它是一种关系语言。您定义的是谓词(即关系),而

我是一个初学者,我有一个快速的问题。我写了一个/2的姐妹谓词,如下所示:

sister_of(X, Y) :-
    female(X),
    parents(X, Z, W) == parents(Y,Z,W),
    X \= Y.
我读这篇文章是因为X是Y的姐妹,如果X是女性,X的父母是Z,Z,W,X和Y不是同一个人。不过,由于某种原因,它没有运行,所以它一定是一个语法问题,一些见解将是非常棒的。多谢各位

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

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

好吧,你开始构建推理,但在比较过程中失败了。以下是您错过的内容:

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
    ,因此
    X
    本身不是姐妹
  • 请注意,前面执行的比较是不必要的(事实上,并不意味着您所期望的),因为在步骤3中
    Z
    W
    被限制为
    X
    的父级。这意味着,
    Z
    W
    在步骤3之后已经有了一个确定的值——换句话说,它们是绑定的

    之后,在步骤4中,
    Y
    只能假定相同的值
    X
    ,或使
    父项(Y,Z,W)
    为真的某个其他值。最后,在步骤5中删除
    X==Y
    的情况,这为(X,Y)的
    姐妹给出了一个有效的定义