prolog - 我的 Swi-prolog 代码对每个查询都返回 true
问题描述
我正在尝试为家庭关系编写 Swi-Prolog 代码。没有错误,但它总是返回 true。磷
man(_Pete).
man(_Mark).
man(_John).
man(_Frank).
man(_Tom).
man(_Matt).
man(_Henry).
man(_Todd).
woman(_Lilly).
woman(_Kate).
woman(_Anne).
woman(_Alice).
woman(_Jenny).
parent(_Pete,_Mark).
parent(_Pete,_Tom).
parent(_Pete,_Anne).
parent(_Mark,_Lilly).
parent(_Mark,_John).
parent(_Mark,_Frank).
parent(_Tom,_Kate).
parent(_Anne,_Alice).
parent(_Anne,_Matt).
parent(_Alice,_Henry).
parent(_Matt,_Jenny).
parent(_Matt,_Todd).
father(X,Y) :- man(X),parent(X,Y).
mother(X,Y) :- woman(X),parent(X,Y).
sibling(X,Y) :- parent(Z,X),parent(Z,Y).
sister(X,Y) :- woman(X),sibling(X,Y).
brother(X,Y) :- man(X), sibling(X,Y).
grandparent(X,Y) :- parent(X,Z),parent(Z,Y).
我期待检查关系。就像我尝试一个函数一样?-父母(皮特,约翰)。我相信它应该返回 false,但它实际上为每个查询返回 true。这是我在 Prolog 上的第一个程序,可能需要帮助来理解问题。
解决方案
你可能打算写名字,但你把匿名变量放在那里。
而不是parent(_Matt,_Todd)
你应该写parent('Matt', 'Todd')
甚至parent(matt, todd)
。
- 这是一个匿名变量:
_X
. - 这是一个正常的变量:
X
. - 这是一个小写的原子。它的长度为 1,因此它也是一个 "char":
x
。 - 这是一个大写字符:
'X'
.
如果你用单引号包裹任何东西,它就会变成一个原子。它也可以有空格。
如果你在前面加上下划线,你会得到一个匿名变量。它在第一个空格或运算符处结束。
如果您收到“单例变量”警告,通常是两件事之一。
初学者通常意味着要写'Bob'
,但要改写Bob
(不带单引号)。
您正在定义一个谓词,但忘记使用其中的一个变量。_Bob
如果你真的不关心它,你要么必须使它成为一个匿名变量,要么你在谓词中找到你应该使用它的地方。
推荐阅读
- android - 从通知导航到带有 NavController 的片段
- python - 如何访问多索引 h5 数据?
- java - 时间复杂度未排序的回溯数组
- php - 如何使用 PHP 将行旋转为列?
- python - 无法使用 Conda 将 PyTorch 1.4.0 更新到 1.5.0
- python - 如何使用 Python 检查 Xpath 是否存在并在 Selenium 中获取跨度文本
- java - 我在android中将时间戳转换为日期和时间有问题吗?
- c# - 无法在 Android 模拟器上调试 Xamarin 并显示消息:调试已取消。请创建一个Android模拟器
- docker - App Engine Flexible - Docker 文件无法安装 GDAL
- python - 变量 DJANGO_CONFIGURATION 未定义 - Django + virtual env + apache