我正在尝试学习swi-prolog的基础知识,我从一个简单的家谱开始。当我尝试编译代码时,它会在第47-53行给我一个Syntax error: Operator expected
,在第60和61行给出Singleton variables:[B, C]
警告。如果熟悉这种语言的人可以查看代码和告诉我,我可能做错了什么,我将不胜感激。此外,如果有人可以推荐一个好的swi-prolog编译器,那将非常感激。
这是代码
%
%Lineage
%
parent_child(stan, lisa).
parent_child(stan, steve).
parent_child(gertrude, steve).
parent_child(steve, adam).
parent_child(steve, brian).
parent_child(steve, jessie).
parent_child(ann, jessie).
parent_child(lisa, dave).
parent_child(allice, adam).
parent_child(ann, brian).
%
%Gender
%
male(adam).
male(brian).
male(dave).
male(kyle).
male(steve).
male(stan).
female(allice).
female(ann).
female(jessie).
female(gertrude).
female(lisa).
%
%Relation Clauses
%
father(X, Y) :- parent_child(X, Y), male(X).
mother(X, Y) :- parent_child(X, Y), feamle(X).
grandfather(X, Z) :- parent_child(X, Y), parent_child(Y, Z), male(X).
grandmother(X, Z) :- parent_child(X, Y), parent_child(Y, Z), female(X).
brother(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y),
parent_child(B, Y), female(A), male(B), male(Y).
brothers(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y),
parent_child(B, Y), female(A), male(B), male(X), male(y).
sister(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y),
parent_child(B, Y), female(A), male(B), female(Y).
sisters(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y),
parent_child(B, Y), female(A), male(B), female(X), female(Y).
aunt(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B).
aunt_nephew(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B),
female(X), male(Y).
aunt_niece(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B),
female(X), female(Y).
uncle(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B).
uncle_nephew(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B),
male(X), male(Y).
uncle_niece(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B),
male(X), female(Y).
cousin(X, Y) :- parent_child(A, X), parent_child(C, A), parent_child(B, Y),
parent_child(C, B).
cousin_male(X, Y) :- parent_child(A, X), parent_child(C, A),
parent_child(B, Y), parent_child(C, B), male(Y).
cousin_female(X, Y) :- parent_child(A, X), parent_child(C, A),
parent_child(B, Y), parent_child(C, B), female(Y).
half_brother(X, Y) :- parent_child(A, X), parent_child(A, Y),
parent_child(B, X), parent_child(C, Y), male(X).
half_sister(X, Y) :- parent_child(A, X), parent_child(A, Y),
parent_child(B, X), parent_child(C, Y), female(X).
答案 0 :(得分:1)
brothers(X,Y):- ... male(B), male(X), male(y).
的第二个句子中有拼写错误。所有变量都必须以大写字母开头。
所有谓词必须以小写字母开头。在第47-53行中有一个谓词调用“Parent(A, B)
”,它以大写字母开头。那是无效的语法。当它更改为parent(A, B)
时,错误就会消失。
有关单例变量的警告意味着该变量仅在谓词的主体中使用一次,即不使用其值。您可以使用无名变量_
代替。通常这意味着你忽略了一些东西。
在这里,你可能意味着B \= C
。其他变量也是如此,例如X
和Y
。
仅使用不同命名的变量并不能确保它们的值不同,您需要添加一个显式检查 - 在两个变量实例化之后。要在实例化之前注册您的意图,您必须使用dif/2
:
2 ?- dif(X,Y),X=1,Y=2.
X = 1
Y = 2
3 ?- dif(X,Y),X=1,Y=1.
No