Пролог: почему этот предикат находит ответ, но игнорирует его и продолжает объединяться с []? - PullRequest
1 голос
/ 29 сентября 2019

Я написал предикат, который должен пройти через список чисел и сравнить текущее число со следующим, затем добавляет большее число в список, который он должен вернуть. Последний номер просто добавляется в список.

Например:

[1,2,3] должен вернуться [2,3,3]

[3,5,6,6,5,9] должен вернуться[5,6,6,6,9,9]

Задача

Предикат находит ответ (записывает его), но не объединяется (?) С ним и продолжает возвращаться[].

Код:

head([H|_], H).
head([],[]).

maximize([], X) :- write(X).
maximize([H|T], X) :-
    (head(T, N), N = []) -> (append(X, [H], L), maximize([], L)) ;
    (head(T, N), H < N) -> (append(X, [N], L), maximize(T, L)) ; (append(X, [H], L), maximize(T, L)).

1 Ответ

1 голос
/ 30 сентября 2019

Решение проблемы, которую вы описываете:

maximize([], []).
maximize([X| Xs], M) :-
    maximize(Xs, X, M).

maximize([], X, [X]).
maximize([Y| Ys], X, M) :-
    (   Y > X ->
        M = [Y| T]
    ;   M = [X| T]
    ),
    maximize(Ys, Y, T).

Примеры вызовов:

| ?- maximize([1,2,3], M).

M = [2,3,3]
yes

| ?- maximize([3,5,6,6,5,9], M).
M = [5,6,6,6,9,9]
yes

Это решение использует индексирование по первому аргументу, чтобы избежать ложных точек выбора.

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