为什么必须在Prolog中将事实组合在一起?

时间:2014-10-09 23:49:59

标签: prolog iso-prolog

说我列出事实:

letter(a).
letter(b).
letter(c).
...
letter(z).
vowel(a).
consonant(b).
consonant(c).
consonant(d).
vowel(e).
consonant(f).
...
consonant(z).

如果我按照“按字母顺序”的顺序声明规则,我会在控制台中收到以下警告:

Warning: /Users/…/prolog-example.pl:31:
  Clauses of vowel/1 are not together in the source-file
Warning: /Users/…/prolog-example.pl:32:
  Clauses of consonant/1 are not together in the source-file
Warning: /Users/…/prolog-example.pl:35:
  Clauses of vowel/1 are not together in the source-file
Warning: /Users/…/prolog-example.pl:36:
  Clauses of consonant/1 are not together in the source-file
Warning: /Users/…/prolog-example.pl:51:
  Clauses of vowel/1 are not together in the source-file

但如果我这样做:

letter(a).
letter(b).
letter(c).
...
letter(z).
consonant(b).
consonant(c).
consonant(d).
...
consonant(z).
vowel(a).
vowel(e).
vowel(i).
vowel(o).
vowel(u).
vowel(y).

我没有得到警告。警告只是warnings还是实际错误?

3 个答案:

答案 0 :(得分:4)

当谓词定义不连续时,谓词应该在其子句之前使用标准discontiguous/1指令声明。在你的情况下:

:- discontiguous([
    letter/1,
    vowel/,
    consonant/1
]).

如果你有没有相应discontiguous/1指令的不连续谓词,后果取决于使用的Prolog系统。例如,SWI-Prolog和YAP将打印警告但接受所有条款。 GNU Prolog将忽略条款。 ECLiPSe将报告编译错误。在Prolog系统没有抛出错误的情况下,通常仍然打印警告,因为谓词可能被检测为不连续的,例如由于例如一个简单的错字在一个条款头。

答案 1 :(得分:2)

它们只是某些系统的警告。这是为了防止您在想要编写新谓词时意外地向谓词添加子句。你可以摆脱SWI中的那些(这些消息看起来就像你从SWI获得的消息,我没有过多地使用其他方言)。

您可以使用style_check/1discontiugous指令。

:- discontiguous vowel/1,consonant/1,letter/1.
% alternative:
:- style_check(-discontiguous).

答案 2 :(得分:2)

标准ISO / IEC 13211-1:1995对此进行了解读:

  

7.4.3条款

     

...

     

用户定义程序P的所有条款均为
  单个Prolog文本的连续读取条款,除非有一个   指令discontiguous(UP) 指令指示P in   Prolog文本。

因此标准要求(»应«)所有条款默认是连续的。现在依赖于添加的子句的程序员或程序不依赖于标准行为。