【问题标题】:Discontiguous predicate warning from GNU Prolog来自 GNU Prolog 的不连续谓词警告
【发布时间】:2011-09-13 11:12:11
【问题描述】:

我已经开始通过 http://www.learnprolognow.org/ 学习 Prolog。我的借口是我才刚刚开始。

我不确定应该如何编写以下(简单?)练习以按预期工作。 http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises

我可以看到 Gnu Prolog 1.4 ( http://www.gprolog.org/ ) 不满意 wizard\1 的第二个谓词不在第一个谓词旁边。我可以重新排序程序以使其工作,但最终我得到的代码对于我的新手 Prolog 眼来说比下面介绍的更难理解。

我是否遗漏了一些明显的东西?

wiz.pl

wizard(ron).
hasWand(harry).
quidditchPlayer(harry).

wizard(X) :- hasBroom(X),hasWand(X).
hasBroom(X) :- quidditchPlayer(X).

咨询wiz.pl

| ?- [wiz].
compiling D:/wiz.pl for byte code...
D:/wiz.pl:5: warning: discontiguous predicate wizard/1 - clause ignored
D:/wiz.pl compiled, 5 lines read - 632 bytes written, 24 ms

【问题讨论】:

    标签: prolog


    【解决方案1】:

    大多数 Prologs 都希望将任何特定谓词的子句列在一起,除非你做了一些魔术。我很惊讶 Striegnitz 和 Bos 忽略了这一点。把程序改成

    % all clauses for wizard/1
    wizard(ron).
    wizard(X) :- hasBroom(X),hasWand(X).
    
    hasWand(harry).
    quidditchPlayer(harry).
    hasBroom(X) :- quidditchPlayer(X).
    

    请注意,我保留了wizard/1 的子句,其顺序与原始程序中的顺序相同。对于这样一个简单的知识库,顺序并不重要,但是在实现非确定性算法时,子句顺序可能会决定生成解决方案的顺序。

    【讨论】:

    • 好的,谢谢,我天真地假设事实会被保存在一起,然后是派生的规则。我会记住你关于订单的注意事项。我也会给作者发邮件征求意见。
    • @AdamStraughan 他们有没有回应?
    • @DanielLyons,我不记得了,搜索我的电子邮件一无所获。抱歉,我帮不上忙。
    • 感谢您的检查!
    【解决方案2】:

    有一个 ISO Prolog discontiguous 指令可以用来放宽对特定谓词的要求:

    http://www.gprolog.org/manual/gprolog.html#htoc53

    【讨论】:

    • 这很有用,但我一直在努力弄清楚如何使用该指令。我正在使用与 OP 相同的学习材料,并且我发现了如何在源代码中使用该指令来解决问题。只需使用这个:
    • 不知何故我错过了我的编辑窗口——只需将其添加到您的知识库顶部::-discontiguous(wizard/1).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多