3
我有以下問題:Prolog的:參數不能充分實例化
生成長度爲2 * N + 1的所有子串,從0,1或-1的值形成,從而A1 = ...,a2n + 1 = 0和| a(i + 1) - ai | = 1或2,每1 < = i < = 2n。
這是我做過什麼:
change(0).
change(1).
change(-1).
%gets the last element from a list
lastE([X],X).
lastE([_|L],X) :-
last(L,X).
%checks if |N-M|=1 or 2
calc(N,M) :-
( 1 is abs(N-M)
; 2 is abs(N-M),
!
).
%generates all lists of length N with values -1,0,1
generate([],0) :-
!.
generate([H|T],N):-
change(H),
N1 is N-1,
generate(T,N1).
%validates a list to be correct (last element=0, |a(i+1) - ai| = 1 or 2)
valid(L) :-
valid(L,_,3).
valid([E],_,_) :-
lastE([E],0).
valid([H|[H1|T]],_,3) :-
valid([H1|T],H,H1).
valid([_|[H1|T]],N,M) :-
calc(N,M),
valid([H1|T],M,H1).
所有上面的代碼工作正常(我測試)。但是對於genAll
,出現Arguments are not sufficiently instantiated
錯誤。
genAll(N) :-
N1 = 2*N,
N2 = N1+1,
generate(L1,N2),
valid(L1),
write('['),
printl(L1).
printl([]) :-
write(']').
printl([0|T]) :-
write('0 '),
printl(T).
printl([1|T]) :-
write('1 '),
printl(T).
printl([-1|T]) :-
write('-1 '),
printl(T).
我不知道什麼是錯的。
你試圖使用'=/2'表達式求值,並賦值,它不會工作。 '=/2'是*統一*。你需要使用'is/2'。例如,「N1是2 * N」。 – lurker
即使使用是 – user4859999
,「is/2」也要求所有變量都有值,才能評估表達式。檢查你的表情。例如,你期望'1是abs(N-M)'做什麼?它不會計算'N',反之亦然。 – lurker