Пара проблем здесь; @Enigmativity права в том, что вам нужно сделать Output
переменной, но is/2
не определен над оператором <
(он используется для оценки арифметических выражений, таких как +
, или those that are user defined).
Вместо этого необходимо учитывать следующее:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
(N < M ->
Output = 'true'
; Output = 'false'
).
Здесь N < M
является логическим тестом который либо успеха или неудачи. ЕслиN < M
верно, то смысл ->
направляет интерпретатор связать переменную Output
с атомом 'true'
, еще к 'false'
, показывающие соотношение длины между списками, которые вы просили. Вы можете связывать все здесь, как вам нравится, а не только атомам.
Исполнительного это дает:
?- min([1,2,3,4],[1,2],Output).
Output = false.
Если вы хотите min/3
просто вернуть меньшее из двух входных списков, вы можете попробовать:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
(N < M ->
Output = List1
; Output = List2
).
Выполнение этого на тот же пример, получает:
?- min([1,2,3,4],[1,2],X).
X = [1, 2].
Вы забыли обновить 'Length = (> =).' – Kaarel
@ Каарел, спасибо, хорошо заметили; Теперь я сделал это непротиворечивым. – sharky
спасибо за объяснение. –