2015-11-15 58 views
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). 

我不知道什麼是錯的。

+1

你試圖使用'=/2'表達式求值,並賦值,它不會工作。 '=/2'是*統一*。你需要使用'is/2'。例如,「N1是2 * N」。 – lurker

+0

即使使用是 – user4859999

+1

,「is/2」也要求所有變量都有值,才能評估表達式。檢查你的表情。例如,你期望'1是abs(N-M)'做什麼?它不會計算'N',反之亦然。 – lurker

回答

3

在這個答案(這主要是猜測)我們使用

 
:- use_module(library(clpfd)). 

n_qfd33721532(N, Zs) :- 
    Zs = [E|Es], 
    N*2 + 1 #= L, 
    length(Zs, L), 
    Zs ins -1..1, 
    last(Zs, 0), 
    chain_neq(Es, E). 

chain_neq([], _). 
chain_neq([E1|Es], E0) :- 
    E0 #\= E1, 
    chain_neq(Es, E1). 

樣品查詢:

 
?- n_qfd33721532(N, Zs), labeling([], Zs). 
    N = 0, Zs = [0] 
; N = 1, Zs = [-1, 1, 0] 
; N = 1, Zs = [ 0,-1, 0] 
; N = 1, Zs = [ 0, 1, 0] 
; N = 1, Zs = [ 1,-1, 0] 
; N = 2, Zs = [-1, 0,-1, 1, 0] 
; N = 2, Zs = [-1, 0, 1,-1, 0] 
; N = 2, Zs = [-1, 1,-1, 1, 0] 
; N = 2, Zs = [-1, 1, 0,-1, 0] 
; N = 2, Zs = [-1, 1, 0, 1, 0] 
; N = 2, Zs = [ 0,-1, 0,-1, 0] 
; N = 2, Zs = [ 0,-1, 0, 1, 0] 
; N = 2, Zs = [ 0,-1, 1,-1, 0] 
; N = 2, Zs = [ 0, 1,-1, 1, 0] 
; N = 2, Zs = [ 0, 1, 0,-1, 0] 
; N = 2, Zs = [ 0, 1, 0, 1, 0] 
; N = 2, Zs = [ 1,-1, 0,-1, 0] 
; N = 2, Zs = [ 1,-1, 0, 1, 0] 
; N = 2, Zs = [ 1,-1, 1,-1, 0] 
; N = 2, Zs = [ 1, 0,-1, 1, 0] 
; N = 2, Zs = [ 1, 0, 1,-1, 0] 
; N = 3, Zs = [-1, 0,-1, 0,-1, 1, 0] 
...