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

时间:2017-11-16 11:53:14

标签: prolog

我在StackOverflow上查看another 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实现中的错误吗?或者这些是可接受的/可预期的行为吗?

1 个答案:

答案 0 :(得分:5)

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

在SWI-Prolog中,这是以问题#166

提交的

Using read/1 on the toplevel commits unexpectedly

SWI顶级的这个缺点阻止用户在许多实际相关的情况下看到所有解决方案。

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