在`read/1`调用之后SWI Prolog回溯行为

lur*_*ker 7 prolog

我正在查看StackOverflow 上的另一个Prolog问题并遇到了这种情况.

假设我有以下事实:

foo(1).
foo(2).
foo(3).
foo(4).
Run Code Online (Sandbox Code Playgroud)

在SWI Prolog(版本7.4.2)提示符下,我练习了这个:

2 ?- write('Enter number: '), read(X), nl, foo(Y), Y > X.
Enter number: 1.

X = 1,
Y = 2.

3 ?-
Run Code Online (Sandbox Code Playgroud)

如您所见,SWI Prolog提供了一个解决方案,没有提示其他解决方案(确实存在).它没有回溯.

在GNU Prolog(版本1.4.4)中,行为更符合我的期望:

| ?- write('Enter number: '), read(X), nl, foo(Y), Y > X.
Enter number: 1.

X = 1
Y = 2 ? ;

X = 1
Y = 3 ? ;

X = 1
Y = 4

yes
| ?-
Run Code Online (Sandbox Code Playgroud)

感谢@trivelt将问题简化为:

?- foo(X).           % Backtracks and finds all solutions for X
?- read(_), foo(X).  % Does not backtrack and finds only one solution for X
Run Code Online (Sandbox Code Playgroud)


这是SWI版本7.4.2实现中的错误吗?或者这些是可选择的/预期的行为吗?

mat*_*mat 5

至少,我认为它是SWI 的严重缺陷,以至于与程序的交互可能会以这种意外的方式干扰顶层控制.

在SWI-Prolog中,这是作为问题#166提交的:

在顶层使用read/1意外提交

SWI顶层的这一缺点使用户无法在许多实际相关的情况下看到所有解决方案.

由于ECLiPSe已经解决了这个问题,也许有人会在某些时候在SWI中修复它.

  • 谢谢,这基本上回答了这个问题,即它是否被官方认为是一个错误,而不是一个可接受的"替代行为"(虽然这样的事情会很奇怪).我应该搜索SWI问题数据库. (3认同)