我有以下问题:
生成长度为 2*n+1 的所有子字符串,由 0、1 或 -1 的值组成,因此 a1 = ...、a2n+1 = 0 和 |a(i+1) - ai| = 1 或 2,对于每 1 <= i <= 2n。这是我在堆栈溢出时发现的,但该解决方案使用了 clpfd 库,我不允许使用任何类型的库:
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 enough instantiated 错误。
genAll(N) :-
N1 is 2*N,
N2 is 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).
我不确定出了什么问题。