Error handling swi prolog族树中的错误

Error handling swi prolog族树中的错误,error-handling,prolog,Error Handling,Prolog,我试图学习swi prolog的基础知识,我从一个简单的家谱开始。当我试图编译代码时,它总是给我一个语法错误:在第47-53行上需要运算符,在第60和61行上给我一个单变量:[B,C]警告。如果任何熟悉这门语言的人都能看看代码,告诉我我可能做错了什么,我将不胜感激。此外,如果有人能推荐一个好的swi prolog编译器,我们将不胜感激 这是密码 % %Lineage % parent_child(stan, lisa). parent_child(stan, steve). parent_ch

我试图学习swi prolog的基础知识,我从一个简单的家谱开始。当我试图编译代码时,它总是给我一个
语法错误:在第47-53行上需要运算符
,在第60和61行上给我一个
单变量:[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).

你在
兄弟(X,Y)的第二个子句中有一个拼写错误:-。。。阳(B)、阳(X)、阳(y)。
所有变量必须以大写字母开头

所有谓词必须以小写字母开头。在第47-53行中有一个谓词调用“
Parent(a,B)
”,它以大写字母开头。这是无效的语法。当它更改为父级(A,B)
时,错误就会消失

关于单例变量的警告意味着该变量在谓词体中只使用一次,即不使用其值。您可以只使用一个无名的var
\uu
。通常这意味着你忽略了一些事情

在这里,您可能是指
B\=C
。其他变量也一样,比如
X
Y

仅仅使用不同名称的变量并不能确保它们的值是不同的,您需要在两个变量都实例化之后添加一个显式检查。要在实例化意图之前注册意图,必须使用:


很好。兄弟姐妹都很特别。在Prolog中,复数以不同的方式处理(参见/3)@OP可能意味着
姐妹(X,Y)
意味着
Y
X
的姐妹,而
姐妹(X,Y)
意味着它们彼此都是姐妹。所以它不是关于多元性,它只是一种关系。@Willenss:我明白了,但sister/2不是那种关系吗?@Capelical不,因为X可能是Y的兄弟,在sister(X,Y)中(大概;我不是在谈论实现,而是关于意图)。
2 ?- dif(X,Y),X=1,Y=2.

X = 1
Y = 2

3 ?- dif(X,Y),X=1,Y=1.

No