пара проблем здесь; @Enigmativity прав в том, что вам нужно сделать переменную Output
, но is/2
не определено оператором <
(он используется для вычисления арифметических выражений, таких как +
или , которые являются пользовательскими определен ).
Вместо этого рассмотрим следующее:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
(N < M ->
Output = 'true'
; Output = 'false'
).
Здесь N < M
- это логический тест , который либо проходит успешно, либо не проходит. Если N < M
имеет значение true, импликация ->
указывает интерпретатору связать переменную 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].