2010-11-15 2 views
1

Я пытаюсь сравнить два списка по длине и установить вывод в true или false.Сравнение двух списков?

min(List1, List2, output) :- 
    length(List1, N), 
    length(List2, M), 
     output is N<M. 

Но я продолжаю получать ошибки, что такое синтаксис для списков?

ответ

3

Пара проблем здесь; @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]. 
+0

Вы забыли обновить 'Length = (> =).' – Kaarel

+0

@ Каарел, спасибо, хорошо заметили; Теперь я сделал это непротиворечивым. – sharky

+0

спасибо за объяснение. –

-1

Простое изменение здесь:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    Output is N<M. 

Output является переменной, а не термин, поэтому она должна начинаться с прописной характер.

Это решение проблемы?

+0

Нет, это дает мне неопределенную ошибку процедуры, когда я делаю что-то вроде: –

+0

мин ([1,2,3,4], [1,2], X). –

0

Это может работать быстрее, чем решения, чем сравнивать длины, если re - небольшой и очень большой список (поскольку он будет остановлен, как только будет достигнут конец самого маленького списка).

min_list([_|L1t], [_|L2t], Output) :- min(L1t, L2t, Output), !. 
min_list(_, [], false). 
min_list([], _, true). 

О синтаксисе списка все, что вы должны знать, что списки выражаются в виде [Head|Tail] где Head является первым элементом списка и Tail подсписка, содержащий остальную часть элементов.

! является вырезать оператор, чтобы избежать возвратов для изучения других решений (если вы не используете его там, система будет ждать вас, чтобы нажать на точку с запятой, если вы хотите еще один ответ, и тогда он будет говорить false).

Предикатные переменные, которые не используются, выражаются в виде подчеркивания (в противном случае вы получите предупреждение об одноэлементных переменных).

Смежные вопросы