Convert peano number s(N) to integer in Prolog

前端 未结 3 1501
Happy的楠姐
Happy的楠姐 2020-12-07 01:55

I came across this natural number evaluation of logical numbers in a tutorial and it\'s been giving me some headache:

natural_number(0).
natural_number(s(N))         


        
3条回答
  •  悲&欢浪女
    2020-12-07 02:20

    No problemo with meta-predicate nest_right/4 in tandem with Prolog lambdas!

    :- use_module(library(lambda)).
    :- use_module(library(clpfd)).
    
    :- meta_predicate nest_right(2,?,?,?).
    nest_right(P_2,N,X0,X) :-
       zcompare(Op,N,0),
       ord_nest_right_(Op,P_2,N,X0,X).
    
    :- meta_predicate ord_nest_right_(?,2,?,?,?).
    ord_nest_right_(=,_,_,X,X).
    ord_nest_right_(>,P_2,N,X0,X2) :-
       N0 #= N-1,
       call(P_2,X1,X2),
       nest_right(P_2,N0,X0,X1).
    

    Sample queries:

    ?- nest_right(\X^s(X)^true,3,0,N).
    N = s(s(s(0))).                 % succeeds deterministically
    
    ?- nest_right(\X^s(X)^true,N,0,s(s(0))).
    N = 2 ;                         % succeeds, but leaves behind choicepoint
    false.                          % terminates universally
    

提交回复
热议问题