swi 您所在的位置:网站首页 swiprolog安装 swi

swi

2023-08-31 07:02| 来源: 网络整理| 查看: 265

我试图学习swi-prolog的基础知识,并且从一个简单的家谱开始。 当我尝试编译代码时,总是在第47-53行给我Syntax error: Operator expected并在第60和61行给我Singleton variables:[B, C]警告。如果熟悉该语言的人可以看一下代码,然后告诉我 可能做错了,将不胜感激。 另外,如果有人可以推荐一个好的swi-prolog编译器,将不胜感激。

这是代码

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273% %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). 相关讨论 SWI Prolog非常好。 兄弟/ 2和姐妹/ 2是不寻常的。 在Prolog中以不同方式处理复数(请参阅findall / 3) @CapelliC OP可能意味着sister(X,Y)表示Y是X的姐妹,而sisters(X,Y)则表示它们彼此是姐妹。 因此,它与多元化无关,而只是一种关系。 @WillNess:我明白了,但那不是姐姐/ 2关系吗? @CapelliC不,因为X可能是sister(X,Y)中Y的兄弟(大概;我不是在谈论实现,而是在谈论意图)。

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

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

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

在这里,您可能已经表示B \= C。 其他变量也可能一样,例如X和Y。

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

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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有