Помощь в прологе - PullRequest
       16

Помощь в прологе

0 голосов
/ 04 марта 2010

Я пытаюсь выучить пролог и столкнулся с проблемой, которую не могу понять. Проблема состоит в том, чтобы написать предикат пролога, который берет все числа списка, которые меньше заданного числа, и помещает их в список, который будет возвращен. Например:

вход: findNum (5, [5, 3, 5, 6, 4, 5], Y)

Выход: Y = [3, 4]

Все, что я пробовал, похоже, провалилось. Так что любая помощь будет высоко ценится. Спасибо.

1 Ответ

2 голосов
/ 04 марта 2010

Чтобы решить эту проблему, вы будете использовать типичный образец Пролога для изучения элементов из вашего входного списка по одному. Пролог включает синтаксис для выбора элемента заголовка из списка, объединяя список с [A | B], первый элемент списка объединяется с A, а остальная часть списка (или пустота, если элементов не осталось) объединяется с B.

Сначала вы должны рассмотреть, сколько пунктов вам понадобится. Вам понадобится одно предложение для обработки случая пустого списка, что также является условием завершения вашей рекурсии. Каждый раз, когда вы просматриваете один элемент списка, вы рекурсивно изучаете оставшуюся часть списка. На последнем экзамене «остаток списка» пуст.

Для предложений, которые проверяют элемент head списка, у вас есть два возможных условия: элемент удовлетворяет вашему критерию поиска (меньше, чем 'num'), или нет. Чтобы представить это, реализуйте два предложения, каждое из которых выполняет итерацию по списку, но только первое из которых соответствует вашим критериям поиска. Предложение, которое обнаруживает «совпадающие» элементы, должно быть записано первым в файле Prolog, чтобы оно было рассмотрено первым.

% This clause is for the "empty input" case which is also used to
% discontinue the recursion when finished.

findNum( _, [], []).

% This clause completes only if the first input element is less than
% 'M'.  If the clause completes, the first input element ('X') is unified
% with the output list ([X | Y]).

findNum( M, [X | L], [X | Y]) :-
    X < M,
    findNum(M, L, Y).

% This clause completes if the above clauses do not.  Much like an "else"
% case, this clause simply removes the first input element from the list,
% the element must not match in the search clause above and so we will now
% discard it.  Thus, it is unified with the "throw away" variable named "_"

findNum( M, [_ | L], Y) :-
    findNum(M, L, Y).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...