Prolog回溯:参数没有充分实例化

时间:2016-01-06 17:13:27

标签: prolog backtracking instantiation-error

我有以下问题:

生成长度为2 * n + 1的所有子字符串,由0,1或-1的值组成,因此a1 = ...,a2n + 1 = 0和| a(i + 1) - ai |对于每1 <= i <= 2n,= 1或2。 这是我在堆栈溢出时发现的,但解决方案使用了clpfd库,我不允许使用任何类型的库:

   <argument>
       <list>
           <bean class="org.apache.shiro.authz.permission.WildcardPermission">
               <argument value="zone1"/>
           </bean>
       </list>
   </argument>

以上所有代码都正常工作(我测试过)。但是使用genAll的以下代码,我得到的参数没有充分实例化错误。

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).

我不确定是什么问题。

0 个答案:

没有答案