首页 > 解决方案 > Prolog 的兄弟谓词不起作用

问题描述

以下是相关代码:

married(X,Y) :- wife(X,Y);husband(X,Y).

parent(X,Y) :- father(X,Y) ;mother(X,Y).

brother(X,Y) :-
man(X),
parent(Z,X),
parent(Z,Y),
X \= Y.

brother_in_law(X,Y) :-
brother(X,Z),married(Z,Y).

我用谷歌搜索,似乎其他人一直在使用兄弟谓词的确切代码,所以应该没问题吗?我检查了其他谓词,它们看起来也不错..不确定发生了什么。

另外,不工作是指当我检查时它不承认相关关系。

标签: prolog

解决方案


查看跟踪,您将看到问题:

?- trace,  brother_in_law(prins-daniel, Y).
   Call: (9) brother_in_law(prins-daniel, _11346) ? creep
   Call: (10) brother(prins-daniel, _11680) ? creep
   Call: (11) man(prins-daniel) ? creep
   Exit: (11) man(prins-daniel) ? creep
   Call: (11) parent(_11678, prins-daniel) ? creep
   Call: (12) father(_11678, prins-daniel) ? creep
   Fail: (12) father(_11678, prins-daniel) ? creep
   Redo: (11) parent(_11678, prins-daniel) ? creep
   Call: (12) mother(_11678, prins-daniel) ? creep
   Fail: (12) mother(_11678, prins-daniel) ? creep
   Fail: (11) parent(_11678, prins-daniel) ? creep
   Redo: (11) man(prins-daniel) ? creep
   Fail: (11) man(prins-daniel) ? creep
   Fail: (10) brother(prins-daniel, _11680) ? creep
   Fail: (9) brother_in_law(prins-daniel, _11346) ? creep
false.

谁是prins-daniel他的父亲?你没有事实。谁是prins-daniel'妈妈?你也没有事实。结果找不到兄弟,所以查询失败。

这是否意味着您缺少事实或缺少代码?代码说,如果 X 有一个与 Y 结婚的兄弟 Z,则 X 和 Y 是姐夫。这是拥有姐夫的唯一方法吗?

旁注:prins-daniel在 Prolog 中不像在 Lisp 中那样是原子。这是一个术语:

?- write_canonical(prins-daniel).
-(prins,daniel)

更长的期限使情况更加复杂:

?- write_canonical(johann-georg-av-hohenzollern).
-(-(-(johann,georg),av),hohenzollern)

只是需要注意的事情。


推荐阅读