为什么 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.
表示没有进一步的解决方案。
我真的不明白为什么 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.
表示没有进一步的解决方案。