番号付きリストから最初の 3 つの要素を切り取り、結果を出力する 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
誰かがエラーの原因とそれを回避する方法を説明してもらえますか? 私はプロローグが初めてです。