我正在尝试为家庭关系写Swi-Prolog代码。没有错误,但始终返回true。 P
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).
我希望检查关系。就像我尝试使用函数?-parent(Pete,John)。我相信它应该返回false,但实际上每个查询都返回true。这是我在Prolog上的第一个程序,可能需要帮助来了解问题。
答案 0 :(得分:3)
您可能打算写名称,但是您在其中放置了匿名变量。
您应该写parent(_Matt,_Todd)
甚至是parent('Matt', 'Todd')
而不是parent(matt, todd)
。
_X
。X
。x
。'X'
。如果将任何内容用单引号引起来,它将成为一个原子。它也可以有空格。
如果将下划线放在前面,则会得到一个匿名变量。它在第一个空格或运算符处结束。
如果收到“单变量”警告,通常是两件事之一。
初学者通常是想写'Bob'
但写Bob
(没有单引号)。
您在定义谓词,却忘记使用其中的变量之一。如果您真的不在乎它,则必须将其设为匿名变量_Bob
,或者在谓词中的哪个位置使用它。