我正在編寫一個Prolog謂詞,將前三個元素從編號列表中刪除並打印結果。編號列表的例子:簡單的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的新手。
'N是C + 1'要求'C'被實例化,因爲它試圖評估'C + 1'。 – lurker
@lurker好吧!對不起,要問這樣一個簡單的問題,但它會如何看待我的代碼?我讀了一些關於實例化變量的內容,但是我沒有看到在這種情況下我能做什麼...... – COLOuRSLIDES
一個簡單的問題沒有錯。 :)但你最終可能會做更多的功課。 「實例化」意味着它需要一個綁定它的值。所以如果'C'沒有值,那麼Prolog就不能評估'C + 1',並且你會得到一個實例化錯誤。爲了解決它,你需要檢查你的邏輯並確保'C'有一個值。你叫'compose(L,e(X,Y),L1)',Prolog最終會嘗試'compose/3'的第二個子句,它與'[e(F,C)| T]沒有與'C'綁定的值。所以'N是C + 1'因爲實例化錯誤而失敗。 – lurker