prolog - 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).
我用谷歌搜索,似乎其他人一直在使用兄弟谓词的确切代码,所以应该没问题吗?我检查了其他谓词,它们看起来也不错..不确定发生了什么。
另外,不工作是指当我检查时它不承认相关关系。
解决方案
查看跟踪,您将看到问题:
?- 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)
只是需要注意的事情。
推荐阅读
- opengl - opengl 和 opengles 有什么区别?
- node.js - 如何在没有 nodemailer 的情况下使用 node js 发送邮件
- c# - 将 SelectedItem(对象)转换为单个字典条目
- cordova - 如何从 Ionic 4 应用程序仅在移动设备的 chrome 浏览器中打开外部 URL
- nginx - 在 auth_request url 位置设置 request_uri 标头
- io - Why the Scylla did not use cgroup blkio for I/O scheduler?
- php - 在没有用户重定向的情况下集成 Oauth - PHP/Adobe Sign
- javascript - 如何使用 lodash 将键值对添加到树结构对象
- c# - 我如何才能返回到我的 C# 窗口窗体设计
- c# - 如何为各种实现创建通用接口?