SWI Prolog 在“read/1”调用后回溯行为



我在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中修复它。

相关内容

最新更新