Сегрегация списков в 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. 

Логически чистая реализация очень проста, благодаря 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 не выполняется.

  • Коллекция была изменена; операция enums не может выполняться в ArrayList
  • Как найти Список имеет повторяющиеся значения в List
  • Итерирование по списку списка в Python
  • Android Endless List
  • список по сравнению с lambda + filter
  • Как удалить строки между ListViews на Android?
  • Преобразование массива int в массив String
  • Сгладить список в Prolog
  • Как создать алфавитную полосу прокрутки, отображающую всю букву в android?
  • Сгладить список в LINQ
  • Как изменить цвет и шрифт в ListView
  • Interesting Posts

    Android – Как создать интерактивный список?

    Попытка UNINSTALL_SHORTCUT, но ярлык не исчезнет

    В Windows 7, как изменить настройки прокси-сервера из командной строки?

    Есть ли способ автоматизировать установку Android-sdk?

    Как решить ошибку LNK2019: нерешенный внешний символ – функция?

    Android – Получить время виджета хронометра

    Как определить искусственный смелый стиль, искусственный курсив и искусственный контурный стиль текста с помощью PDFBOX

    Как использовать два внешних монитора на Alienware m17x вместе с монитором ноутбука (всего 3 монитора)

    Как «монтировать» раздел в Windows 7?

    Как создать / запустить эту простую программу Mahout без получения исключений?

    Как удалить 2-пиксельную строку строки задач в Windows 7, когда панель задач скрыта?

    Структура для нескольких проектов JSF с общим кодом

    Как включить C ++ 11 в Eclipse Juno / Kepler / Luna CDT?

    Проверяет ли foreach массив на каждой итерации?

    Преобразовать встроенный код сборки в C ++

    Давайте будем гением компьютера.