>source

Prolog에서 power 술어에 대한 꼬리 재귀 도우미를 만들려고합니다. 지금까지 나는 이것을 가지고 있지만 테스트 할 때 도우미 술어를 호출하려고 할 때 중단 점이 있다는 메시지가 나타납니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 도움을 청하십시오.

   trpow(Base, Exp, Res) :- trpow_helper(Base, Exp, 1, Res).
    
    trpow_helper(_, 0, Acc, Acc).
    trpow_helper(Base, Exp, Acc, Res) :-
        Exp > 0,
        Decexp is Exp - 1,
        Acc1 is Acc * Base,
        Res = Acc1,
        trpow_helper(Base, Decexp, Acc1, Res).

  • 답변 # 1

    코드에 따라

    trpow(Base, Exp, Res) :- trpow_helper(Base, Exp, 1, Res).
    trpow_helper(_, 0, Acc, Acc):- !. /*Cut to avoid bt to second clause*/
    trpow_helper(Base, Exp, Acc, Res) :-
        Exp > 0,
        Decexp is Exp - 1,
        Acc1 is Acc * Base, /*removed Res = Acc1, not needed*/
        trpow_helper(Base, Decexp, Acc1, Res).
    
    

    이제 작동합니다!

  • 답변 # 2

    swi-prolog에서와 같은 CLP 사용 :

    :- use_module(library(clpfd)).
    trpow(Base, Exp, Res) :- trpow_helper(Base, Exp, 1, Res).
    trpow_helper(   _, Exp, Acc, Acc):- Exp #= 0.
    trpow_helper(Base, Exp, Acc, Res) :-
        Exp #> 0,
        Decexp #= Exp - 1,
        Acc1 #= Acc * Base,
        trpow_helper(Base, Decexp, Acc1, Res).
    ?- trpow(1, E, 1).
    E = 0 ;
    E = 1 .
    ?- trpow(2, E, 4).
    E = 2 .
    
    

  • 이전 string - C #에서 두 개의 쉼표로 구분 된 목록을 비교하여 차이점 확인
  • 다음 ajax - HTML을 사용하여 버튼으로 테이블을 다시 만드는 방법은 무엇입니까?