我有以下问题:
生成长度为2 * n + 1的所有子字符串,由0、1或-1的值组成,所以a1 = ...,a2n + 1 = 0,且对于每个1 <= i <= 2n,| a(i +1) -ai | = 1或2。
这是我做的:
上述所有代码都是正确的(我测试过了)。但是使用下面的
生成长度为2 * n + 1的所有子字符串,由0、1或-1的值组成,所以a1 = ...,a2n + 1 = 0,且对于每个1 <= i <= 2n,| a(i +1) -ai | = 1或2。
这是我做的:
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 is 2*N
。 - lurker