-2

我正在尝试学习 swi-prolog 的基础知识,我从一个简单的家谱开始。当我尝试编译代码时,它一直Syntax error: Operator expected在第 47-53 行给我一个Singleton variables:[B, C]警告,在第 60 和 61 行给出一个警告。如果熟悉该语言的人可以查看代码并告诉我我可能做错了什么,它会不胜感激。此外,如果有人可以推荐一个好的 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).
4

1 回答 1

1

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

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

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

在这里,您可能是这个意思B \= C。其他变量也是如此,比如Xand Y,可能。

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

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

X = 1
Y = 2

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

No
于 2013-04-24T20:17:47.497 回答