Я пишу предикат Пролога, который отсекает первые три элемента из пронумерованного списка и печатает результат. Пример нумерованного списка:Простая программа Пролог: ошибка «Аргументы недостаточно создаются»
[e(f,1),e(o,2),e(o,3),e(b,4),e(a,5),e(r,6)].
Оригинальный предикат для нормального списка выглядит следующим образом:
strim([H|T],R) :-
append(P,R,[H|T]),
length(P,3).
Таким образом, поскольку длина предикат отлично работает для нумерованных списков, а я только должен был написать предикат что добавляет один пронумерованный список к другому:
compose([],L,[L]).
compose([e(F,C)|T],e(A,_),[e(F,C)|L]) :-
N is C+1,
compose(T,e(A,N),L).
napp(X,[],X).
napp(L,[e(X,Y)|T],M):-
compose(L,e(X,Y),L1),
napp(L1,T,M).
Я ожидал, что предикат для нумерованного списка, чтобы быть немного измененная версия предиката для нормального списка, так что я написал это:
numstrim([e(X,Y)|T],R) :-
napp(P,R,[e(X,Y)|T]),
length(P,3).
Однако, я получаю эту ошибку:
ERROR: compose/3: Arguments are not sufficiently instantiated
Может кто-нибудь объяснить, что вызывает ошибку и как ее избежать? Я новичок в Prolog.
'N is C + 1' требует, чтобы' C' был создан, так как он пытается оценить 'C + 1'. – lurker
@ lurker хорошо! извините, просить простой вопрос, как это, но как он будет выглядеть в моем коде? Я немного читал об экземплярах переменных, но я не вижу, что я могу сделать в этом случае конкретно ... – COLOuRSLIDES
Ничего плохого в простом вопросе. :) Но у вас может быть больше домашней работы. «Инициировано» означает, что ему нужно связанное с ним значение. Поэтому, если 'C' не имеет значения, то Prolog не может evalutate' C + 1', и вы получите ошибку создания. Чтобы исправить это, вам нужно проверить свою логику и убедиться, что значение 'C' имеет значение. Вы вызываете 'compose (L, e (X, Y), L1)', и Prolog в конечном итоге попытается выполнить второе предложение для 'compose/3', которое соответствует' L' с '[e (F, C) | T]', без значения, связанного с 'C'. Таким образом, 'N является C + 1' терпит неудачу с ошибкой создания. – lurker