Сегрегация списков в Prolog

Мне очень трудно понять, как заставить мой код показывать мои разделенные списки, состоящие из четных и нечетных чисел. Я даже не уверен, чего не хватает моему пониманию. Я новичок в этом языке и должен использовать его для школы. Мой императивный и функциональный ум не даст мне знать, что, черт возьми, происходит с этим LOL.

Теперь, нет, я не прошу вас делать домашнее задание! Я просто прошу вас помочь мне понять, что я не понимаю. Я также искал похожие ответы, но я не могу преобразовать их в способ, которым я должен написать эту функцию.

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

Вот:

is_even(H) :- 0 is mod(H, 2). segregate(List, Even, Odd) :- segregator(List, Even, Odd). segregator([], [], []). segregator([H|T], E, O) :- is_even(H), % I feel here is where I am supposed to build the list, % but I have no clue how since Even or Odd has not been unified. segregator(T, E, O), write('Even is '), write(E), nl. segregator([H|T], E, O) :- % Same here as above. segregator(T, E, O), write('Odd is '), write(O), nl. 

One Solution collect form web for “Сегрегация списков в Prolog”

Логически чистая реализация очень проста, благодаря clpfd :

 :- use_module(library(clpfd)). list_evens_odds([],[],[]). list_evens_odds([X|Xs],[X|Es],Os) :- X mod 2 #= 0, list_evens_odds(Xs,Es,Os). list_evens_odds([X|Xs],Es,[X|Os]) :- X mod 2 #= 1, list_evens_odds(Xs,Es,Os). 

Некоторые примеры запросов, которые мы ожидаем добиться (с конечной последовательностью ответов):

 ?- Xs = [1,2,3,4,5,6,7], list_evens_odds(Xs,Es,Os). Xs = [1,2,3,4,5,6,7], Es = [ 2, 4, 6 ], Os = [1, 3, 5, 7] ; false. ?- list_evens_odds(Ls,[2,4],[1,3]). Ls = [2,4,1,3] ? ; Ls = [2,1,4,3] ? ; Ls = [2,1,3,4] ? ; Ls = [1,2,4,3] ? ; Ls = [1,2,3,4] ? ; Ls = [1,3,2,4] ? ; no 

Как насчет запросов, которые мы ожидаем ?

 ?- list_evens_odds(Ls,[2,4,5],[1,3]). no ?- list_evens_odds(Ls,[2,4],[1,3,6]). no ?- list_evens_odds([_,_,_],[2,4],[1,3]). no 

Наконец, самый общий запрос :

 ?- assert(clpfd:full_answer). yes ?- list_evens_odds(Ls,Es,Os). Ls = [], Es = [], Os = [] ? ; Ls = [_A], Es = [_A], Os = [], _A mod 2#=0, _A in inf..sup ? ... 

Изменить 2015-05-06

Вот еще один способ сделать это с логической чистотой !

Используйте мета-предикат tpartition/4 вместе с zeven_t/2 или zodd_t/2 .

 bool01_t(1,true). bool01_t(0,false). zeven_t(Z,Truth) :- Z mod 2 #= 0 #< ==> B, bool01_t(B,Truth). %zodd_t(Z,Truth) :- Z mod 2 #= 1 #< ==> B, bool01_t(B,Truth). zodd_t(Z,Truth) :- Z mod 2 #= B, bool01_t(B,Truth). % tweaked 

zeven_t/2 подтверждает четность целого числа, zodd_t/2нечетность .

Со всем на месте, давайте запустим некоторые запросы!

 ? - tpartition (zeven_t, [1,2,3,4,5,6,7], Es , Os ).
 Es = [2,4,6], Os = [1,3,5,7].
 ? - tpartition (zodd_t, [1,2,3,4,5,6,7], Os , Es ).  % аргумента порядок отличается
 Es = [2,4,6], Os = [1,3,5,7].

Оба успеха детерминистичны . Эквивалентный запрос с использованием list_evens_odds/3 не выполняется.

  • Списки эликсиров интерпретируются как списки символов
  • Использование LINQ для удаления элементов из списка
  • Коллекция была изменена; операция enums не может выполняться в ArrayList
  • Как объединить два списка в Python?
  • Разница между скобками и двойной скобкой ] для доступа к элементам списка или кадра данных
  • Предоставляет ли List , что элементы будут возвращены в том порядке, в котором они были добавлены?
  • Пользовательский шрифт для Android listview
  • Как удалить элемент из списка по индексу в Python?
  • Как изменить цвет и шрифт в ListView
  • Объяснение того, как работает вложенный список?
  • В чем разница между List (of T) и Collection (of T)?
  • Давайте будем гением компьютера.