Prolog:源文件中的子句未组合在一起

35

我有这段代码:

% Family tree
female(pen).
male(tom).
male(bob).
female(liz).
female(pat).
female(ann).
male(jim).

parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat, jim).

我收到了这个错误:

Warning: Clauses of female/1 are not together in source-file
Warning: Clauses of male/1 are not together in source-file

这个错误的目的是什么?
我的意思是,文件可以编译和运行得很好,并且我知道这个错误的含义。但为什么会出现这个错误呢?
这只是强制执行最佳实践的通知吗?

我非常新于逻辑编程。
谢谢!


对于那些不知道如何修复它的人:按关系名称(在本例中为“男性”和“女性”)对关系进行分组。 - Martin Thoma
@MartinThoma 如何对其进行分组? - eqrakhattak
2个回答

24

正确的,这是为了强制实施最佳实践而发出的警告,即在源文件中将所有相关子句放在一起。除此之外,在源文件中子句彼此的位置关系并不重要,只要它们的相对顺序不改变即可。


有没有办法关闭它?有时我就是无法以那种方式编写代码。 - intelis
1
@intelis 有一种方法可以告诉Prolog,你打算在各个子句之间进行分布(链接到一个解释如何做到这一点的答案)。 - Sergey Kalinichenko
谢谢,但这不仅仅是从句的问题。我收到了许多不同的警告,比如单例变量等。 - intelis
2
@intelis 你应该修复单例变量警告:它们更加重要,因为一个小的拼写错误可能会导致你的规则不正确。我曾经不得不调试别人的Prolog程序,因为作者忽略了这个警告。问题是他犯了一个拼写错误——在一个23个字符长的变量名中,他把一个大写字母O替换成了数字0,并忽略了警告。如果你确实需要一个单例变量,只需将其替换为下划线以消除警告即可。 - Sergey Kalinichenko
我不确定 Singleton 变量是什么 :) ? - intelis
2
@intelis 单例变量是指在规则的整个主体中仅使用一次的变量(即以大写字母开头的标识符)。单例变量可以与任何内容统一,但是统一的结果未被使用。有时这是合法的,此时您应将变量重命名为“_”。然而,很多情况下这是由于不正确地将原子大写化(例如使用female(Jane).而不是female(jane).)或拼写变量名称错误所导致的。 - Sergey Kalinichenko

13
警告提示鼓励最佳实践,有助于发现拼写错误。以下是一个错别字示例:
small(ant).
small(fly).
small(molecule).

smell(sweet).
smell(pungent).
small(floral).

这个错误很难发现,但幸运的是编译器会发出警告:

Warning: /tmp/test.pl:7:
Clauses of small/1 are not together in the source-file

有警告和行错误提示,可以更快地找到并纠正打字错误。

ISO Prolog提供了discontiguous/1指令,以消除特定谓词的此警告。请参见规范的第7.4.2.3节。使用方法如下:

:- discontiguous small/1.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接