2014-09-20 2 views
0

Можно ли скопировать каждый элемент i из списка в подсписку с только один тройной подсписчик предиката (Элемент, List1, List2) и встроенная длина и добавление? Я знаю, с 4-элементными вспомогательными предикатами, он становится довольно тривиальным, но это не то, что мне нужно. Можно ли предложить стратегию?Пролог каждый элемент i в подсписке

ответ

2

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

sublist(Element, List1, List2) :- 
    findall(E, (nth1(I, List1, E), 0 is I mod Element), List2). 

пока явно итерация:

sublist(Element, List1, List2) :- 
    ( N is Element-1, 
     length(T, N), 
     append(T, [E|R], List1) 
    -> sublist(Element, R, ListR), 
     List2 = [E|ListR] 
    ; List2 = [] 
    ). 

, где вы можете увидеть, как у вас se Boris '

+2

findall/3 без каких-либо ошибок и декларативных данных не собраны. – false

+0

О стрелке, (Условие -> WhenTrue; WhenFalse). Я не задаю другого вопроса – CapelliC

1

Вы можете использовать lentgth/2 с первым аргументом переменных и вторым целым, чтобы создать список не экземпляры переменных, например:

?- length(L, 4). 
L = [_G936, _G939, _G942, _G945]. 

Если теперь использовать append/3 с этим списком в качестве первого аргумент, и переменная, как вторые, он будет разделен список в вашем третьем аргументе:

?- length(A, 4), append(A, B, [a,b,c,d,e,f,g,h]). 
A = [a, b, c, d], 
B = [e, f, g, h]. 

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

?- length(A, 4), append(A, [Fifth|Rest], [a,b,c,d,e,f,g,h]). 
A = [a, b, c, d], 
Fifth = e, 
Rest = [f, g, h]. 

Это не решение, но действенная стратегия:

every_ith(I, In, [X|Ys]) :- 
    N is I - 1, 
    length(Prefix, N), 
    append(Prefix, [X|Xs], In), 
    every_ith(I, Xs, Ys). 
+1

Если я правильно понял этот код, он просто ищет и элемент с заданным номером в списке. Однако мне нужно было скопировать * каждый элемент * в список. Например: подсписк ([1,2,3,4], 2, X). X = [2,4]. Помогает ли этот код? Поиск элемента может быть проще. Я что-то упускаю? – user3614293

+2

Вы просили стратегию, а не решение. Посмотрите на редактирование для большего намека. – 2014-09-20 13:11:01

Смежные вопросы