Parsing numbers with multiple digits in Prolog

后端 未结 3 885
北荒
北荒 2021-01-11 14:41

I have the following simple expression parser:

expr(+(T,E))-->term(T),\"+\",expr(E).
expr(T)-->term(T).

term(*(F,T))-->factor(F),\"*\",term(T).
ter         


        
相关标签:
3条回答
  • 2021-01-11 15:36

    Use accumulator variables, and pass those in recursive calls. In the following, A and A1 are the accumulator.

    digit(0) --> "0".
    digit(1) --> "1".
    % ...
    digit(9) --> "9".
    
    nat(N)   --> digit(D), nat(D,N).
    nat(N,N) --> [].
    nat(A,N) --> digit(D), { A1 is A*10 + D }, nat(A1,N).
    

    Note that the first nat clause initializes the accumulator by consuming a digit, because you don't want to match the empty string.

    0 讨论(0)
  • 2021-01-11 15:36
    nat(0). 
    nat(N):-nat(N-1).
    

    But you use a syntax that I don't know (see my comment above).

    0 讨论(0)
  • 2021-01-11 15:41

    Can you provide a sample input?

    I think this might work:

    nat(N)-->number(N).
    

    If that fails try:

    nat(N)-->number(N),!.
    

    The ! is a cut it stops the unification. You can read about it in books/tutorials.

    0 讨论(0)
提交回复
热议问题