Найти последний элемент в списке различий - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь найти последний элемент (все числа) без "разрушения" списка.

В настоящее время у меня есть следующее:

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 в качестве свободной переменной.

Надеюсь, я написал это ясно.Большое спасибо заранее.

1 Ответ

0 голосов
/ 15 сентября 2018

В библиотеке 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.

В вашем случае, если вы можете убедиться, что списки различий всегда правильно сформированы, а их элементы являются точными, вы можете упростить определение.

...