首页 > 解决方案 > 如何在这个 Prolog 程序中调试“预期的操作员”?

问题描述

我正在尝试对家谱进行查询,但是当我输入所有信息时,出现语法错误:操作员预期。我是 Prolog 的新手。

name=symbol

谓词

 parent(name,name)
 female(name)
 male(name)
 sister(name,name)
 son(name,name)
 father(name)
 grandmother(name)

条款

female(stella).
female(lizzy).
female(emily).
female(mia).
female(alice).

male(hubert).
male(ben).
male(john).
male(danny).
male(sam).

 parent(stella,ben).
 parent(stella,mia).
 parent(hubert,ben).
 parent(hubert,mia).
 parent(lizzy,emily).
 parent(lizzy,john).
 parent(ben,emily).
 parent(ben,john).
 parent(mia,sam).
 parent(mia,alice).
 parent(danny,sam).
 parent(danny,alice).
 sister(X,Y):-female(X),parent(Par,X),parent(Par,Y),X\==XY.
 son(X,Y):-parent(Z,X),parent(Z,Y),male(X),X\==Y.
 father(X,Y):-parent(X,Y),male(X).
 grandmother(X,Y):-parent(X,Y),female(X)

标签: prolog

解决方案


这里有两个问题:

  1. 您忘记了.结尾处的点 ( ) 表示该子句的结束;和
  2. 这并不是真正的错误,但是您X\==XYsister/2子句中写了,因为XY是一个新变量,所以这将始终成功。

谓词还有一个语义问题grandmother/2:现在它定义了一个“母亲”谓词。我把它留作练习。

我还建议重新格式化您的代码(Prolog 不会按行向您收费,它可以更清楚地说明子句在哪里结束以及它的作用)。

sister(X,Y) :-
    female(X),
    parent(Par,X),
    parent(Par,Y),
    X \== Y.

son(X,Y) :-
    parent(Z,X),
    parent(Z,Y),
    male(X),
    X \== Y.

father(X,Y) :-
    parent(X,Y),
    male(X).

grandmother(X,Y) :-
    parent(X,Y),
    female(X).

推荐阅读