从 Prolog 列表返回多个值

Returning multiple values from a Prolog list

在此 Prolog 练习中,我尝试 return 列表中大于数字 N 的值。

例如:greater_than([5,6,1,7], 5, X)应该returnX = 6 ; X = 7.

我尝试通过以下方式解决此问题:

greater_than([],_,_).   % to stop recursion when list is empty
greater_than([H|T],N,X) :-
   H > N,
   X is H,
   greater_than(T,N,M). % if H>N return X=H
greater_than([H|T],N,X) :-
   H =< N,
   greater_than(T,N,X). % if H=<N just continue recursion.

我的代码在只有一个结果时有效:greater_than([1,2,5], 2, X) returns X = 5.

但它不适用于多个结果:greater_than([1,2,5,7], 2, X) returns false.

我从这里了解到 X 已经绑定到一个数字并且 (X is H) 第二次 returns false.

但我不知道如何获得多个结果。

我尝试更改变量名称:

greater_than([H|T],N,X) :-
   H > N,
   X is H,
   greater_than(T,N,X1).   % X1 for example

但这没有用。

I understood from this that X is already binded to a number and (X is H) for the second time returns false.

差不多,但不完全是因为这些发生在不同的调用中,因此可以独立运行。您的代码绑定 X=5,然后在下一次调用中绑定 M=7,您无处可以看到 M 的值。7 已经被使用,当您再次搜索时,没有更多的答案可以找到,因为它有找到所有答案,到达列表末尾。

您混淆了回溯和递归,这两种不同的解决方法。

回溯解决方案:

greater_than(List, Cutoff, X) :-
   member(X, List),
   X > Cutoff.

然后:

?- greater_than([1,2,5,7], 2, X).
X = 5 ;
X = 7

它找到一个答案,然后等待,然后你要求更多,它找到更多。

递归解决方案遍历代码中的列表,而不是让 Prolog 执行它,例如构建包含所有答案的列表:

greater_than([], _, []).  % recursion base case. Empty list input, empty list output.
greater_than([H|T], Cutoff, [H|Result_T]) :-
    H > Cutoff,
    greater_than(T, Cutoff, Result_T).
greater_than([H|T], Cutoff, Result) :-
    H =< Cutoff,
    greater_than(T, Cutoff, Result).

然后:

?- greater_than([1,2,5], 2, X).
X = [5]