Пролог: удалить все элементы из списка выше X - PullRequest
2 голосов
/ 17 ноября 2011

Я пытаюсь написать программу пролога, которая удалит все элементы в списке выше значения X.

Например, я хочу удалить из этого списка все элементы выше 50:

[2,8,18,34,40,44,46,51,52,54,64,66,76,90]

Итак, я получаю:

[2,8,18,34,40,44,46]

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

Было бы приятно увидеть, как далеко вы продвинулись.Что вызывает у вас проблемы?

Идея большинства этих проблем обычно выглядит примерно так:

  1. Создайте базовый вариант, обычно пустые списки.
  2. Попробуйтечтобы вернуться к нижней части рекурсии и в пути, оставьте только нужные элементы.Здесь сохранение означает, что вы выполняете рекурсию с удаленными нежелательными элементами.
  3. Для того, чтобы он правильно "сросся", как в случае, когда рекурсия возвращается обратно, вы должны правильно определить список вывода.

На самом деле есть два пути к этому.Либо удаляйте элементы при спуске, либо игнорируйте их при возврате.По сути, это одно и то же.

Я не лучший, чтобы объяснить это.Я просто опубликую свое решение.Но я настоятельно рекомендую вам сделать все возможное, прежде чем смотреть на это.:)

delete_gt([], _, []) :- !.
delete_gt([Head|Rest], X, L) :-
  Head > X, !,
  delete_gt(Rest, X, L).
delete_gt([Head|Rest], X, [Head|L]) :-
  delete_gt(Rest, X, L).
0 голосов
/ 17 ноября 2011

Вы также можете рассмотреть эту утилиту из apply library

del_elems_higher :-
    exclude(condition, [2,8,18,34,40,44,46,51,52,54,64,66,76,90], L), writeln(L).

condition(X) :- X > 50.

тест:

?- del_elems_higher.
[2,8,18,34,40,44,46]
0 голосов
/ 17 ноября 2011

Использование аккумулятора

removeHigherThan( X, List, Ans) :-
    removeHigherThan( X, List, Ans, [] ), !.

removeHigherThan( _, [], Ans, Ans).
removeHigherThan( X, [H | Tail], Ans, Acc ) :-
    (
        ( H > X, NewEl = [] )
        ; 
        ( H =< X, NewEl = [H] )
    ),    
    append( Acc, NewEl, NewAcc ),
    removeHigherThan( X, Tail, Ans, NewAcc).

Работает так

?- removeHigherThan(10, [1,4], X).
X = [1, 4].

?- removeHigherThan(10, [1,12,4], X).
X = [1, 4].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...