【问题标题】:Undefined procedure error in prolog SWIprolog SWI 中的未定义过程错误
【发布时间】:2015-01-13 03:07:56
【问题描述】:

第一次在 Windows 8 上运行 prolog SWI

这是我的程序 (.pl) 文件,非常基本,只有 3 个事实:(我是一个完整的 prolog 初学者)

hello.
a.
b.

当我在 prolog-SWI 中加载(咨询)它并使用该程序时,我的输出中出现此错误:

12 ?- b.
true.

13 ?- a.
true.

14 ?- c.
ERROR: toplevel: Undefined procedure: c/0 (DWIM could not correct goal)

现在,如果这是一个简单的错误,因为程序中从未将 c 声明为事实,那很好,但是在查看在线示例以及我在这些示例中的 Prolog 类中找到的示例后,回复 @987654325 @ 表示程序中有事实,no 表示没有。如果是,我的回复true,如果不是,则给我那个长错误。

查看此链接以获取example

在哪里回复 no 雾。

【问题讨论】:

    标签: prolog prolog-toplevel


    【解决方案1】:

    SWI 有一个略有不同的顶层 shell,其灵感来自 Prolog IV 的 shell。这个想法是你再次得到一个可执行查询的答案。因此true. 代替yesfalse. 代替no。如果您想将答案“粘贴回”到下一个查询中,这将特别有用。

    ?- append(Xs,Ys,[1,4,7]).
    Xs = [],
    Ys = [1, 4, 7] ;
    Xs = [1],
    Ys = [4, 7] ;
    Xs = [1, 4],
    Ys = [7] ;
    Xs = [1, 4, 7],
    Ys = [] ;
    false.
    

    当您使用 library(clpfd) 之类的约束时,它会更加有用:

    ?- use_module(library(clpfd)).
    true.
    
    ?- X #> 3, X#>=Y,abs(X) #< 100.
    X in 4..99,
    X#>=Y,
    Y in inf..99.
    

    另一个问题是许多系统中常见的默认行为:如果没有子句并且没有其他提及特定谓词,系统会假定您输入错误的名称并相应地给您一个错误。 如果您真的坚持(不要!),您可以使用 set_prolog_flag(unknown, fail). 将行为时间切换到 1970 年代后期,但最好立即使用 set_prolog_flag(unknown, error) 将其切换回来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多