我目前正在尝试学习如何使用Prolog。我安装了SWI-Prolog version 6.2.6
。
似乎运行:
?- 3<4.
true.
?- 4<3.
false.
作为第一个例子,我试图实现询问有关家谱的问题。所以我从头开始,存储在family.pl
:
father(bob,danna).
father(bob,fabienne).
father(bob,gabrielle).
mother(alice,danna).
mother(alice,fabienne).
mother(alice,gabrielle).
father(charlie,ida).
father(charlie,jake).
mother(danna,ida).
mother(danna,jake).
father(edgar,kahlan).
mother(fabienne,kahlan).
father(hager,luci).
mother(gabrielle,luci).
male(X) :- father(X,_).
female(X) :- mother(X,_).
但是当我尝试用consult(family).
加载时,我得到:
?- consult(family).
Warning: /home/moose/Desktop/family.pl:7:
Clauses of father/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:9:
Clauses of mother/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:11:
Clauses of father/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:12:
Clauses of mother/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:13:
Clauses of father/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:14:
Clauses of mother/2 are not together in the source-file
% family compiled 0.00 sec, 17 clauses
true.
我不明白这里有什么问题。我发现一些结果提到-
无法在标识符中使用,但我没有在标识符中使用-
。
问题1 :是什么原因造成上述警告?我该如何解决?
但是只有警告,所以我继续
?- female(fabienne).
true.
?- male(fabienne).
false.
好的,这似乎按预期工作。
然后我添加了
male(jake).
female(ida).
female(kahlan).
female(luci).
brother(X,Y):-
male(X),
(mother(Z,X)=mother(Z,Y);father(Z,X)=father(Z,Y)).
并尝试:
?- brother(jake,ida).
false.
为什么不是这样?
问题2:我的brother
规则有什么问题?
答案 0 :(得分:2)
您的第一个问题已经回答here。
至于第二种,你是在考虑功能而不是关系。
mother(Z,X) = mother(Z,Y)
与说X = Y
相同,因为它比较了两个术语,而没有解释它们。如果您希望Z
成为X
和Y
的母亲,则需要合作:
mother(Z, X), mother(Z, Y)
答案 1 :(得分:0)
我将兄弟定义分成2,因为更清楚,这就像逻辑OR(第一个定义有效或第二个定义)
father(bob,danna).
father(bob,fabienne).
father(bob,gabrielle).
father(charlie,ida).
father(charlie,jake).
father(edgar,kahlan).
father(hager,luci).
mother(alice,danna).
mother(alice,fabienne).
mother(alice,gabrielle).
mother(danna,ida).
mother(danna,jake).
mother(fabienne,kahlan).
mother(gabrielle,luci).
male(jake).
male(X) :- father(X,_).
female(X) :- mother(X,_).
brother(X,Y):-
male(X),
mother(Z,X),mother(Z,Y).
brother(X,Y):-
male(X),
father(Z,X),father(Z,Y).
用于试运行
brother(X,Y).
要获得更多结果,你需要添加谁是男性opr女性为那些孩子,就像我为杰克做的那样