我正在查看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 的严重缺陷,以至于与程序的交互可能会以这种意外的方式干扰顶层控制.
在SWI-Prolog中,这是作为问题#166提交的:
SWI顶层的这一缺点使用户无法在许多实际相关的情况下看到所有解决方案.
由于ECLiPSe已经解决了这个问题,也许有人会在某些时候在SWI中修复它.