【问题标题】:Why does Prolog predicate member/2 print an extra whitespace in output?为什么 Prolog 谓词 member/2 在输出中打印额外的空格?
【发布时间】:2018-05-14 14:09:45
【问题描述】:

我真的不明白为什么 Prolog 只在 member/2 谓词之后打印一个空格。以下是来自我的控制台的文本。

?- member(1, [1, 2, 3]).
true .

?- string("why").
true.

这真的让我发疯了!

【问题讨论】:

  • 在第一种情况下,true 是一个结果和提示,等待您输入一些内容来告诉 Prolog 下一步该做什么。我假设您显示的时间段是因为您按下了.,但您可以按下; 或它期望的其他有效命令。在第二种情况下,它只是一个没有请求输入的结果。这很清楚。无需恐慌。只是呼吸......
  • 非常感谢您的解释!我正在写一个解析器,我认为这真的会混淆字符解析,但幸运的是事实并非如此!
  • 是的,在这里您只是在处理人工交互的产物。在程序中调用时,谓词不会真正返回您看到的结果。它们只是直观地指示用户谓词调用的成功或失败。

标签: prolog swi-prolog prolog-toplevel


【解决方案1】:

这是一个旨在显示您实际上已在顶层中止查询的功能。让我们考虑一个更明确的情况,您最初会得到:

?- member(1,[1,1]).
true 

在这里,Prolog 确认这是真的,但仍在等待您的回复。如果您使用 SPACE; 要求更多,您将获得下一个解决方案:

?- member(1,[1,1]).
true ;
true.

但是,如果您点击 Return.,Prolog 将中止您的查询。为了在屏幕上显示这个,插入了一个额外的空间:

?- member(1,[1,1]).
true .

传统上,当查询本身不包含任何变量时,许多实现从不要求地面查询的替代方案。这种“优化”通常会隐藏意想不到的循环。

在您的示例中,Prolog 不知道是否有可能提供进一步的答案,因此暂时提示。如果你再要求更多,你会得到:

?- member(1, [1, 2, 3]).
true ;
false.

这表示没有进一步的解决方案。

【讨论】:

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