我在StackOverflow上查看另一个Prolog问题,遇到了这种情况。
假设我有以下事实:
foo(1).
foo(2).
foo(3).
foo(4).
在SWI Prolog(版本7.4.2(提示符下,我练习了这个:
2 ?- write('Enter number: '), read(X), nl, foo(Y), Y > X.
Enter number: 1.
X = 1,
Y = 2.
3 ?-
如您所见,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
| ?-
感谢@trivelt将问题简化为:
?- foo(X). % Backtracks and finds all solutions for X
?- read(_), foo(X). % Does not backtrack and finds only one solution for X
<小时 />这是 SWI 版本 7.4.2 实现中的错误吗?或者这些替代行为是可接受/预期的?
至少,我认为与程序的交互可能会以这种意想不到 的方式干扰顶级 控件,这是 SWI 顶层的严重缺陷。
在SWI-Prolog中,这是作为问题 #166提交的:
在顶层使用 read/1 意外提交
SWI顶层的这一缺点使用户无法在许多实际 相关的情况下查看所有解决方案。
由于ECLiPSe已经解决了这个问题,也许有人也会在某个时候在SWI中修复它。