我正在使用SWI-Prolog,当我尝试运行一些我写的谓词时,他们会在我的答案结束时自动完全停止并直接进入下一行。虽然有些人要求我自己输入或者把满座位放在那里。这是为什么?
% range(1,5,X) -> X = [1,2,3,4,5]
range(X, X, [X]).
range(Low, High, [Low | Xs]) :-
Low =< High,
Low1 is Low+1,
range(Low1, High, Xs).
这是我需要手动&#39;要么按回车键,要么按&#39;。&#39;要完成,如果我按下&#39;,它也会返回false。但我不明白为什么它会返回虚假。
答案 0 :(得分:1)
当您按下;
时,您告诉PROLOG最后一个结果对您来说不够好,它应该回溯到最后一个决策点并进入另一个分支。如果没有决策点,Prolog将不允许您按;
。在样本函数的情况下,当两个参数相等时进行决策,并且range(X, X, [X]).
和range(Low, High, [Low | Xs])...
两种情况都是有效选择。您给出的第一个结果将与range(X, X, [X]).
对应,并将返回[X]
,这是该范围的最后一个元素。如果我们假设原始查询为range(1,2,X)
,则搜索将以range(2,2,[2]).
结尾。但是当您按;
时,它将转到:
range(2, 2, [2|Xs]) ....
将执行递归查询
range(3, 2, Xs) ....
Low =< High
最终会失败
并产生false
结果。