Проблема со списком прологов

[a,b,c,d] and
[[1,2,3,4],[5,6,7,8],[43,34,56,5],[23,32,2,2]]

я хочу сделать

[[a,1,2,3,4],[b,5,6,7,8],[c,43,34,56,5],[d,23,32,2,2]]

Я использую swi prolog, возможно ли это сделать?

Большое спасибо.


person selda    schedule 16.05.2011    source источник


Ответы (4)


solve([], [], []).

solve([[X|Y]|S], [X|L1], [Y|L2]):-
  solve(S, L1, L2).

ОБНОВЛЕНИЕ: как использовать

Запишите функцию в файл "a.pl", затем введите в swi-prolog:

['a.pl'].

затем введите:

solve(X, [a,b,c,d], [[1,2,3,4],[5,6,7,8],[43,34,56,5],[23,32,2,2]]).

Ты получишь:

X = [[a, 1, 2, 3, 4], [b, 5, 6, 7, 8], [c, 43, 34, 56, 5], [d, 23, 32, 2, 2]] 

У меня странное ощущение, что я делаю твою домашнюю работу. Это?

person Vincent Cantin    schedule 16.05.2011
comment
Решение находится в первом параметре, а затем в 2 списках, которые вы упомянули. Я надеюсь, вы не просите людей делать ваши домашние задания. - person Vincent Cantin; 16.05.2011
comment
Пролог Swi отвечает только ложью. на этот вопрос. - person Andro; 16.05.2011
comment
позвольте мне установить swi-prolog, я попробую. Вы поняли логику? - person Vincent Cantin; 16.05.2011
comment
Вы правы, я допустил ошибку при тестировании вашего решения. Я приношу извинения. - person Andro; 16.05.2011

Используйте мета-предикат maplist/4 и лямбда-выражения Пролога примерно так:

?- As  = [a,b,c,d], 
   Bss = [[1,2,3,4],[5,6,7,8],[43,34,56,5],[23,32,2,2]],
   maplist(\H^T^[H|T]^true,As,Bss,Css).
As  = [ a         , b         , c            , d           ],
Bss = [[  1,2,3,4],[  5,6,7,8],[  43,34,56,5],[  23,32,2,2]],
Css = [[a,1,2,3,4],[b,5,6,7,8],[c,43,34,56,5],[d,23,32,2,2]].

Редактировать

В приведенной выше цели maplist/4 можно использовать разные лямбда-термины, как указано в комментарии.

  • maplist(\H^T^[H|T]^true,As,Bss,Css)
  • maplist(\H^T^ =([H|T]) ,As,Bss,Css)
person repeat    schedule 04.08.2015
comment
Альтернативно: ..., maplist(\H^T^ =([H|T]),As,Bss,Cs). - person false; 04.08.2015
comment
@ложный. Умная! Хорошая комбинация лямбда-аргументов + соединение (для частичного применения цели). Должен быть частью учебника по лямбда-прологу... - person repeat; 04.08.2015

SWI Prolog может сделать это с помощью двух коротких предикатов:

merge0(A, B, Prev, Next) :- append(Prev, [[A|B]], Next).
merge(A, B, Result) :- foldl(merge0, A, B, [], Result).

Вот пример ввода и вывода:

a(X) :- X = [a,b,c,d].
b(X) :- X = [[1,2,3,4],[5,6,7,8],[43,34,56,5],[23,32,2,2]].

?- a(A), b(B), merge(A, B, Result).

Result = [[a, 1, 2, 3, 4], [b, 5, 6, 7, 8], [c, 43, 34, 56, 5], [d, 23, 32, 2, 2]].
person Grzegorz Adam Kowalski    schedule 24.04.2014

попробуй это:

delete(X, [X|T], T).

delete(X, [Y|T], [Y|L]):-
delete(X, T, L).

insert(X, List, BigList):-
  delete(X, BigList, List).

if([],X,X).

if([H1|T1],[H2|T2],[SH|ST]):-
  insert(H1,H2,SH),!,
  if(T1,T2,ST).

Дважды проверил, работает.

«если» означает «вставить первым».

person Andro    schedule 16.05.2011
comment
Мне кажется слишком сложным и императивным стилем. - person Vincent Cantin; 16.05.2011
comment
хорошо, это пример использования возможности разреза :) - person Andro; 16.05.2011