【问题标题】:Swi prolog Error: Showing true but not falseSwi prolog 错误:显示真但不假
【发布时间】:2013-11-18 17:44:45
【问题描述】:

刚刚在我的 W8 机器上安装了 SWI-Prolog,它抛出了一个错误。

这是错误:

ERROR: toplevel: Undefined procedure: mark/0 (DWIM could not correct goal)

假设我的 prolog 源文件包含一个事实:

 Prolog source...

 it_is_monday.   //The fact

所以我编译缓冲区,并得到:

.../documents/prolog/prologSource compiled 0.00 sec, 2 clauses

现在当我输入时

it_is_monday. 

预期的输出是true。但是,当我输入说时,

some_other_statement.

我收到上面发布的错误,而不是错误。谁能告诉我这里发生了什么?

解决方案:不同的 prolog 版本。

【问题讨论】:

    标签: prolog iso-prolog


    【解决方案1】:

    有一个标准的 Prolog 标志 unknown,在 SWI-Prolog 和其他现代 Prolog 编译器中默认设置为 error,这意味着尝试调用未知谓词将导致异常。可以将此标志设置(使用标准的set_prolog_flag/2 谓词)而不是fail 以获得您似乎期望的行为,但这是不可取的,因为它可能会使调试更加困难。例如。谓词名称中的简单拼写错误将导致失败,在复杂的程序中可能难以追查,而谓词存在错误将在现场查明罪魁祸首。

    【讨论】:

    • 是的,这是一个有用的功能。我没有定义谓词,或者命名谓词的一些拼写错误/更改,是我编写 Prolog 时最典型的错误。当然,如果想用fail 的结果来剔除一个谓词,这可能是一种有用的策略。
    【解决方案2】:

    你得到了错误

    ERROR: toplevel: Undefined procedure: mark/0 (DWIM could not correct goal)

    因为您尚未定义您尝试执行的过程。 (这就是为什么它说undefined

    如果你定义它,通过编辑你的 .pl 文件并写入 some_other_statement.

    然后你再次运行它,你会得到

    1 ?- some_other_statement.
    true.
    

    在 Prolog 中,您需要定义要执行的每个过程。

    当您尝试执行未定义的过程时,该过程的名称将显示在错误中。所以,如果你还没有定义some_other_statement.,错误将会是:

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

    注意 some_other_statement/0 显示在我收到的错误中。

    编辑:如果您想获得false 消息,则必须定义some_other_statement(1). 之类的内容,然后执行some_other_statement(12). 之类的查询

    2 ?- some_other_statement(12).
    false.
    

    【讨论】:

    • 对不起,我没有在问题中说明我期待的是错误而不是错误,因此造成了混乱。我在另一台机器上使用旧版本的 prolog,当出现未定义的过程时输出 false。
    • 我编辑了我的帖子。我不知道旧版本,但在当前版本上,您会收到上述错误
    【解决方案3】:

    如果你想收到 false ,你可以添加指令

    :- dynamic(some_other_statement/0).
    

    在文件的开头,所以当你执行查询时

    ?- some_other_statement.
    

    你会误会

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多