从 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]
在此 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]