Как записать результат в список вместо распечатки в прологе - PullRequest
0 голосов
/ 08 октября 2018

Я пишу предикат для нахождения большего числа в парах.Если у числа нет пары - оно будет просто добавлено.

write_list([A|[]]):- write(A).
write_list([A, B|Tail]) :- ((A>B, write(A));(A<B,write(B))), nl, 
write_list([B|Tail]).

Моя проблема в том, что я не могу понять, как записать результат в другой список вместо того, чтобы распечатать результат:

write_list([1,2,6,8,5], X).
X = [2,6,8,8,5].

1 Ответ

0 голосов
/ 08 октября 2018

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.

Таким образом, в зависимости от ситуации он может:

  1. полностью восстановить список;
  2. построить список с некоторыми переменными с интервалами;или
  3. доказательство невозможности построения такого списка.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...