2013-04-24 101 views
-2

我正在嘗試學習swi-prolog的基礎知識,並以一棵簡單的家族樹開始。當我嘗試編譯代碼時,它會一直給我一個在第47-53行的Syntax error: Operator expected和第60和61行的一個Singleton variables:[B, C]警告。如果熟悉該語言的人可以查看代碼並告訴我我可能做錯了什麼這將非常感激。另外,如果任何人都可以推薦一個好的swi-prolog編譯器,那將是非常感謝。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

[SWI序言(http://www.swi-prolog.org/)是優秀的。 – 2013-04-24 20:41:41

+0

兄弟/ 2和姐妹/ 2是不尋常的。在Prolog中多元化的處理方式是不同的(參見[findall](http://www.swi-prolog.org/pldoc/doc_for?object=findall/3)/ 3) – CapelliC 2013-04-24 21:26:31

+0

@CapelliC OP可能是爲姐妹X,Y)「表示」Y「是」X「的姐妹,而」姐妹(X,Y)「則表示他們都是彼此的姐妹。所以它不是關於複數,它只是一種關係。 – 2013-04-24 22:14:20

回答

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