Как извлечь данные для перечисления в прологе? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть массив L какого-то типа, я пытаюсь извлечь данные в массив, например:

L=[day(sunday),day(monday)]

в

Target=[sunday,monday]

Пробовал с помощьюforall и выполнил поиск связанных вопросов в списках прологов.

extract_data_to_list(L,Target) :-
    member(day(Day),L),
    length(L, L1),
    length(Target, L1),
    member(Day,Target).

Текущий вывод:

?- extract_data_to_list([day(sunday),day(monday)],Target).
Target = [sunday, _5448] ;
Target = [_5442, sunday] ;
Target = [monday, _5448] ;
Target = [_5442, monday].

Требуемый вывод:

?- extract_data_to_list([day(sunday),day(monday)],Target).
Target=[sunday,monday]

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

У меня есть пара других способов сделать это, на всякий случай, если вам интересно.

?- findall(D, member(day(D), [day(monday), day(tuesday)]), Days).
Days = [monday, tuesday].

Хитрость в том, что вы можете использовать findall/3 для запуска простого цикла, еслиGoal (аргумент 2) использует member/2.В этом случае мы объединяем day(D) с каждым элементом в списке;никакой дополнительной работы, кроме объединения, действительно не требуется, поэтому мы можем «оторвать обертку» только с помощью member/2, но вы можете запустить более сложный цикл, заключив в скобки аргументы.Предположим, вы хотите изменить day на day-of-week, например:

?- findall(DoW, (member(day(D), 
                 [day(monday), day(tuesday)]), DoW=day_of_week(D)), 
           Days).
Days = [day_of_week(monday), day_of_week(tuesday)].

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

Второй трюк специфичен для SWI-Prolog (или Logtalk, если вы можете его использовать), то есть новой библиотеки (yall) :

?- maplist([Wrapped,Day]>>(Wrapped=day(Day)),
          [day(monday),day(tuesday)], X).
X = [monday, tuesday].

library(yall) позволяет писатьанонимные предикаты.[Wrapped,Day]>>(Wrapped=day(Day)) в некотором роде похож на встроенный предикат, он делает здесь именно то, что делает предикат day_name/2 @ lurker, за исключением того, что непосредственно внутри самого вызова maplist/3 не требуется отдельный предикат.Общий синтаксис выглядит примерно так: [Variables...]>>Goal.Подобные вещи ранее были доступны как library(lambda) и были функцией Logtalk в течение многих лет.

0 голосов
/ 24 июня 2018

Это идеальная проблема для library(lambda) для SICStus | SWI :

maplist(\day(N)^N^true, Dates, Daylist).
0 голосов
/ 23 июня 2018

Это идеальная проблема для maplist:

day_name(day(DayName), DayName).

dates_daylist(Dates, DayList) :-
    maplist(day_name, Dates, DayList).

Maplist применяется day_name к каждой соответствующей паре элементов в Dates и DayList.

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