首页 > 解决方案 > 我的 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 上的第一个程序,可能需要帮助来理解问题。

标签: prolog

解决方案


你可能打算写名字,但你把匿名变量放在那里。

而不是parent(_Matt,_Todd)你应该写parent('Matt', 'Todd')甚至parent(matt, todd)

  • 这是一个匿名变量:_X.
  • 这是一个正常的变量:X.
  • 这是一个小写的原子。它的长度为 1,因此它也是一个 "char": x
  • 这是一个大写字符:'X'.

如果你用单引号包裹任何东西,它就会变成一个原子。它也可以有空格。

如果你在前面加上下划线,你会得到一个匿名变量。它在第一个空格或运算符处结束。

如果您收到“单例变量”警告,通常是两件事之一。

初学者通常意味着要写'Bob',但要改写Bob(不带单引号)。

您正在定义一个谓词,但忘记使用其中的一个变量。_Bob如果你真的不关心它,你要么必须使它成为一个匿名变量,要么你在谓词中找到你应该使用它的地方。


推荐阅读