Есть пара фундаментальных проблем.
В вашей задаче находится ваше представление о списке. Ваши предикаты, по-видимому, предполагают, что, например, [3, [a,b,c]]
представлен как [3 | [a,b,c]]
, но это не так. Список [3 | [a,b,c]]
- это список с 3
в качестве главы, а [a,b,c]
как остальная часть списка или хвост. Другими словами, [3 | [a,b,c]]
- [3, a, b, c]
.
И, таким образом, ваш базовый случай будет:
minway([[N,L]], N, L).
Вторая проблема в ваших других предикатных статей. Начальная точка для D
. Другими словами, ему никогда не давали значения, поэтому вы получаете ошибку создания. Вы не можете сравнить N > D
, если одна из переменных не имеет значения.
При выполнении минимума или максимума с нуля, общий подход заключается в том, чтобы начать с того, что первым элементом является результат кандидата, а затем замените его, если вы найдете лучший на каждом этапе рекурсии. Это также означает, что вам нужно носить с собой последним кандидатом на каждый рекурсивный вызов, так что добавляет дополнительные аргументы:
minway([[N,L]|T], D, R) :-
minway(T, N, L, D, R).
minway([], D, R, D, R). % At the end, so D, R is the answer
minway([[N,L]|T], Dm, Rm, D, R) :-
( N < Dm
-> minway(T, N, L, D, R) % N, L are new candidates if N < Dm
; minway(T, N, Dm, Rm, D, R) % Dm, Rm are still best candidate
).
В Прологе, вы можете упростить это немного, поскольку Пролог имеет более общий термин оператор сравнения, @<
, @>
и т. Д., Которые умеют сравнивать более сложные термины. Например, значение [2, [d,e,f]] @< [3, [a,b,c]]
верно, так как значение 2 < 3
. Затем мы можем написать:
minway([H|T], D, R) :-
minway(T, H, D, R).
minway([], [D, R], D, R).
minway([H|T], M, D, R) :-
( H @< M
-> minway(T, H, D, R)
; minway(T, M, D, R)
).