【问题标题】:prolog error from classifying a subclass of an atom对原子的子类进行分类的序言错误
【发布时间】:2018-11-29 07:36:27
【问题描述】:

我仍在学习 prolog,但遇到了这个错误。

Warning: /usr/local/home/jay275/SDRIVE/cs3500/hw7/part1.pl:23:
    Clauses of bird/1 are not together in the source-file
      Earlier definition at /usr/local/home/jay275/SDRIVE/cs3500/hw7/part1.pl:10
      Current predicate: animal/1
      Use :- discontiguous bird/1. to suppress this message

我想说的是,如果是鹰,那么它就是一只鸟。 如果它是一只鸟,那么它就是一种动物......等等......

这是我的代码:

cat(sylvester).
cat(felix).

dog(spike).
dog(fido).

primate(george).
primate("king kong").

bird(tweety).

hawk(tony).

fish(nemo).

%then Mammal if cat or dog or primate
mammal(X) :- cat(X) ; dog(X) ; primate(X).

%then Animal if mammal or bird or fish
animal(X) :- mammal(X) ; bird(X) ; fish(X).

%then bird if hawk
bird(X) :- hawk(X).

编辑:我不认为这个错误实际上会导致任何问题,但我只是确保我没有做任何不正确的事情。

EDIT2:TAS 通过将以下代码放在一起回答了我的问题。

bird(tweety).

%then bird if hawk
bird(X) :- hawk(X).

hawk(tony).

【问题讨论】:

  • bird(tweety).bird(X) :- hawk(X). 行之间还有其他谓词,将它们放在连续的行中,就像使用 dog/1 和 cat/1 一样。
  • 对不起,我试图理解你的意思,但我正在尝试做我认为你在谈论的事情,但它仍然给我一个错误。
  • 其实你的意思是扔鸟(X):-鹰(X)。在鸟(翠蒂)之后。 ?
  • @tas:想让这个成为正确的答案吗?
  • @lambda.xy.x:完成。

标签: prolog


【解决方案1】:

该消息通知您谓词bird/1 的子句位于源文件中的不同位置,即第10 行(bird(tweety).)和第23 行(bird(X) :- hawk(X).)。这两行之间有其他谓词的子句(hawk/1、fish/1、mammal/1、animal/1),因此bird/1的定义是不连续的。

标准 ISO/IEC 13211-1:1995 规定了以下条款:

7.4.3 条款

[...]

用户定义过程P 的所有子句应为
单个 Prolog 文本的连续阅读术语,除非有
是指令discontiguous(UP) 指示P
在那个 Prolog 文本中。

所以你有两个选择:

1) 将建议的指令添加到源文件中:

:- discontiguous bird/1.

cat(sylvester).
cat(felix).
.
.
.

2) 你修改了你的源文件,使得 bird/1 的子句出现在连续的行中:

cat(sylvester).
cat(felix).

dog(spike).
dog(fido).

primate(george).
primate("king kong").

bird(tweety).
%then bird if hawk          % <- moved here from the end of source file
bird(X) :- hawk(X).         % <- moved here from the end of source file

hawk(tony).

fish(nemo).

%then Mammal if cat or dog or primate
mammal(X) :- cat(X) ; dog(X) ; primate(X).

%then Animal if mammal or bird or fish
animal(X) :- mammal(X) ; bird(X) ; fish(X).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 2019-10-05
    • 2014-06-29
    • 1970-01-01
    • 2017-09-30
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多