добавление элементов по одному в новый список в рекурсии пролога - PullRequest
0 голосов
/ 08 октября 2019

дано add(X,InputList,OutputList), где Outputlist - последовательность элементов X из InputList. мы читаем InputList подсчитываем количество элементов и добавляем элементы к Outputlist, пока не достигнем элементов X.

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

size([],0).
size([H|T],N) :- size(T,N1), N is N1+1.
append2([], List2, List2).
append2([H|T], List2, [H|Result]) :- append2(T, List2, Result)

фактические результаты должны выглядеть следующим образом

add(4, [1,2,3], X)
(0, [a,b,c,d], X).  

и эти ошибки

add(0,[q],[q]).
add(3,[a,b,z,c],[a,b,c]).

1 Ответ

1 голос
/ 09 октября 2019

Я рад, что вы пытаетесь использовать библиотечные предикаты для выполнения этой задачи. Например, вы могли бы сделать что-то вроде этого:

add(N, List, Prefix) :-
    length(Prefix, N),
    append(Prefix, _, List).

По сути, это говорит о том, что «Префикс - это список длины N, который может быть добавлен к чему-то или другому для создания входного списка». Конечно, у вас нет причин беспокоиться о реализации ваших собственных версий length/2 и append/3, поскольку они являются ISO.

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

add(0, _, []).
add(N, [X|Xs], [X|Result]) :-
   succ(N0, N),
   add(N0, Xs, Result).

В общем, этот предикат называется take/3, потому что OutputList - это просто результат получения N элементов из InputList.

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