我正在编写一个 Prolog 谓词,它将前三个元素从编号列表中删除并打印结果。编号列表的示例:
[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 的新手。