swi-prolog系列树出错

时间:2013-04-24 17:50:42

标签: error-handling prolog

我正在尝试学习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).

1 个答案:

答案 0 :(得分:1)

brothers(X,Y):- ... male(B), male(X), male(y).的第二个句子中有拼写错误。所有变量都必须以大写字母开头。

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

有关单例变量的警告意味着该变量仅在谓词的主体中使用一次,即不使用其值。您可以使用无名变量_代替。通常这意味着你忽略了一些东西。

在这里,你可能意味着B \= C。其他变量也是如此,例如XY

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

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

X = 1
Y = 2

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

No