在差异列表中查找最后一项
Find last item in a difference list
我正在尝试查找没有 "ruining" 列表的最后一项(所有数字)。
我目前拥有的是:
max([_|Xs]-Xs,R):-
Xs \= [],
max2(Xs,R),!.
max([X|Xs]-Xs,R):-
R = X.
max([]-[],99999).
Max2 是一个在普通列表中查找最后一项的函数:
max2([X],X):-
number(X),!.
max2([_|Xs],R):-
max2(Xs,R),!.
当我尝试使用一个列表时,它起作用了——否则失败了:
max([22|X]-X,R)
R = 22
max([22,27|X]-X,R)
Stack limit (0.2Gb) exceeded
Stack sizes: local: 0.2Gb, global: 21Kb, trail: 3Kb
Stack depth: 1,560,328, last-call: 0%, Choice points: 1,560,312
Probable infinite recursion (cycle):
[1,560,328] max2([cyclic list], _1452)
[1,560,327] max2([cyclic list], _1484)
我尝试了其他方法,但是当我给它一个包含一项的列表时,它转换了它:
max([22|X]-X,R)
X = []
R = 22
所以我无法继续将 X 用作自由变量。
希望我写清楚了。
非常感谢。
在Logtalk库中,我使用了如下定义:
last(List-Back, Last) :-
List \== Back,
List = [Head| Tail],
last(Tail-Back, Head, Last).
last(List, Last, Last) :-
unify_with_occurs_check(List, Back-Back).
last(List-Back, _, Last) :-
List \== Back,
List = [Head| Tail],
last(Tail-Back, Head, Last).
调用示例:
?- last([22|X]-X,R).
R = 22 ;
false.
?- last([a,b,c|X]-X,R).
R = c ;
false.
?- last(DL, Last).
DL = [Last|_1648]-_1648 ;
DL = [_1652, Last|_1648]-_1648 ;
DL = [_1652, _1664, Last|_1648]-_1648 ;
DL = [_1652, _1664, _1676, Last|_1648]-_1648 ;
DL = [_1652, _1664, _1676, _1688, Last|_1648]-_1648
...
这个定义非常笼统,因为它也适用于变量列表。例如:
?- last([X,Y,Z|Tail]-Tail, Last).
Z = Last ;
false.
在你的情况下,如果你能确保差异列表总是格式正确并且它们的元素是基础的,你可以简化定义。
我正在尝试查找没有 "ruining" 列表的最后一项(所有数字)。
我目前拥有的是:
max([_|Xs]-Xs,R):-
Xs \= [],
max2(Xs,R),!.
max([X|Xs]-Xs,R):-
R = X.
max([]-[],99999).
Max2 是一个在普通列表中查找最后一项的函数:
max2([X],X):-
number(X),!.
max2([_|Xs],R):-
max2(Xs,R),!.
当我尝试使用一个列表时,它起作用了——否则失败了:
max([22|X]-X,R)
R = 22
max([22,27|X]-X,R)
Stack limit (0.2Gb) exceeded
Stack sizes: local: 0.2Gb, global: 21Kb, trail: 3Kb
Stack depth: 1,560,328, last-call: 0%, Choice points: 1,560,312
Probable infinite recursion (cycle):
[1,560,328] max2([cyclic list], _1452)
[1,560,327] max2([cyclic list], _1484)
我尝试了其他方法,但是当我给它一个包含一项的列表时,它转换了它:
max([22|X]-X,R)
X = []
R = 22
所以我无法继续将 X 用作自由变量。
希望我写清楚了。 非常感谢。
在Logtalk库中,我使用了如下定义:
last(List-Back, Last) :-
List \== Back,
List = [Head| Tail],
last(Tail-Back, Head, Last).
last(List, Last, Last) :-
unify_with_occurs_check(List, Back-Back).
last(List-Back, _, Last) :-
List \== Back,
List = [Head| Tail],
last(Tail-Back, Head, Last).
调用示例:
?- last([22|X]-X,R).
R = 22 ;
false.
?- last([a,b,c|X]-X,R).
R = c ;
false.
?- last(DL, Last).
DL = [Last|_1648]-_1648 ;
DL = [_1652, Last|_1648]-_1648 ;
DL = [_1652, _1664, Last|_1648]-_1648 ;
DL = [_1652, _1664, _1676, Last|_1648]-_1648 ;
DL = [_1652, _1664, _1676, _1688, Last|_1648]-_1648
...
这个定义非常笼统,因为它也适用于变量列表。例如:
?- last([X,Y,Z|Tail]-Tail, Last).
Z = Last ;
false.
在你的情况下,如果你能确保差异列表总是格式正确并且它们的元素是基础的,你可以简化定义。