为什么 Prolog 谓词 member/2 在输出中打印一个额外的空格?

Why does Prolog predicate member/2 print an extra whitespace in output?

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

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

?- string("why").
true.

这真让我抓狂!

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

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

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

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

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

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

传统上,当查询本身不包含任何变量时,许多实现从不要求基于地面查询的替代方案。这 "optimization" 经常隐藏意想不到的循环。

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

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

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