write
только печатает содержимое на стандартный вывод, оно не «возвращает» его в список результатов.В Прологе единственный способ генерировать значения - это объединение.
Таким образом, вам нужно определить предикат maxpair/2
, , а не write_list/1
.
Таким образом, предикатвыглядит так:
:- use_module(library(clpfd)).
maxpair([A], [A]).
maxpair([A, B|Tail], [H|T]) :-
H #= max(A, B),
maxpair([B|Tail], T).
В первом предложении говорится, что maxpair/2
одноэлементного списка - это тот одноэлементный список.Последний говорит, что maxpair/2
для списка, содержащего два или более списков, представляет собой список, который начинается с максимума первых двух элементов, и мы повторяем его в конце списка.
Вышеприведенное также можетполучить список в обратном порядке.Например:
?- write_list(L, [5, 3, 2, 1]).
L = [5, 3, 2, 1] ;
false.
?- write_list(L, [1, 4, 2, 5]).
false.
?- write_list(L, [3, 3, 5, 5]).
L = [_542, _548, _554, 5],
_542 in inf..3,
3#=max(_542, _548),
_548 in inf..3,
3#=max(_548, _554),
_554 in inf..3 ;
false.
?- write_list(L, [3, 5, 5, 4]).
L = [_1128, _1134, 5, 4],
_1128 in inf..3,
3#=max(_1128, _1134),
_1134 in inf..3 ;
false.
Таким образом, в зависимости от ситуации он может:
- полностью восстановить список;
- построить список с некоторыми переменными с интервалами;или
- доказательство невозможности построения такого списка.