Сравнивая два списка? - PullRequest
       18

Сравнивая два списка?

1 голос
/ 15 ноября 2010

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

пара проблем здесь; @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].
0 голосов
/ 14 ноября 2011

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

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

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

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

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

0 голосов
/ 15 ноября 2010

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

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

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

Решает ли это вашепроблема?

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