【问题标题】:Prolog predicateProlog谓词
【发布时间】:2014-04-30 14:06:55
【问题描述】:

您好,我是 Prolog 的新手,有基本问题。我想知道为什么这些 Prolog 谓词 daughter_of/2son_of/2 不能像我希望的那样工作。例如,如果我问

16 ?- daughter_of(alice, X).
true.

(为什么是真的?我需要什么谓词才能得到 Victoria 和 Albert?)

谢谢。

male(albert).
male(edward).

female(alice).
female(victoria).

parents(edward, victoria, albert).
parents(alice, victoria, albert).

sister_of(X,Y):-
    female(X),
    parents(X,M,F),
    parents(Y,M,F).

brother_of(X,Y):-
    male(X),
    parents(X,M,F),
    parents(Y,M,F).

daughter_of(X,Y):-
    female(X),
    parents(X,M,F).

son_of(X,_Y):-
    male(X),
    parents(X,M,F).

【问题讨论】:

  • Y 不会出现在 daughter_of(X, Y) 谓词子句的正文中。

标签: prolog predicate


【解决方案1】:

问题是你的doutter_of谓词的定义。

daughter_of(X,Y):-
female(X),
parents(X,M,F).

应该是

daughter_of(X,Y):-
female(X),
parents(X,Y,_).

daughter_of(X,Y):-
female(X),
parents(X,_,Y).

这样 Y 参数就被传递给了父谓词。否则它不会被使用(甚至在加载文件时给我一个警告)。那么 prolog 只能告诉你 X 是女性并且 X 有父母,但实际的父母会被丢弃,因为 M 和 F 不是你的谓词的输出参数。

请注意,我已经定义了 daughter_of 谓词两次,以便与父亲和母亲一起使用。

同样适用于son_of。

【讨论】:

  • 您好,谢谢。当您说 M 和 F 不是谓词的输出参数时,您是什么意思?翻译成简单的英语,如果 X 是女性并且 X 的父母是 Y 和 _,则 X 是 Y 的女儿(什么是 __?Y 还没有找到与 Victoria 的统一吗?(因为第二个谓词 Y 现在被要求与其他东西统一) ?(为什么不给它一个新变量?)再次感谢。
  • 我的意思是 Y 和 M / Y 和 F 永远不会统一。当您调用daughter_of(alice, X) 时,您希望输出/结果(维多利亚和阿尔伯特)与X 统一。所以X 是您的输出变量。但是在您的谓词内部,M 和 F 永远不会与 Y 统一。M 将与值 Victoria 统一。您期望 X=Victoria,但 X 未与 M 统一。