2:- module(string2digit,[string2digit/2,string2score/2]).    3
    4:- use_module(library(lists),[member/2,append/3]).    5
    6/*========================================================================
    7   Converting strings to digits
    8========================================================================*/
    9
   10string2digit(X,Y):-       %%% forty-five ==> 45
   11   atom(X),
   12   member(Sep,['-','~']),
   13   atomic_list_concat([Tens,Ones],Sep,X),
   14   string2digit(Tens,TensNum), TensNum < 91, TensNum > 19, 
   15   string2digit(Ones,OnesNum), OnesNum < 10, !,
   16   Y is TensNum+OnesNum.
   17
   18string2digit(X,Y):-       %%% two-thousand ==> 2000
   19   atom(X),
   20   member(Sep,['-','~']),
   21   atomic_list_concat([Ones,Cens],Sep,X),
   22   string2digit(Ones,OnesNum), 
   23   string2digit(Cens,CensNum), OnesNum < CensNum, !,
   24   Y is OnesNum*CensNum.
   25
   26string2digit(X,Y):-       %%% two ==> 2
   27   atom(X),
   28   s2d(X,Y), !.
   29
   30string2digit(X,Y):-       %%% remove two commas from number expressions
   31   name(X,Codes1), 
   32   append(Codes0,[44,A,B,C,44,D,E,F],Codes1), 
   33   append(Codes0,[A,B,C,D,E,F],Codes2), 
   34   name(Y,Codes2),
   35   number(Y), !.
   36
   37string2digit(X,Y):-       %%% remove one comma from number expressions
   38   name(X,Codes1), 
   39   append(Codes0,[44,A,B,C],Codes1), 
   40   append(Codes0,[A,B,C],Codes2), 
   41   name(Y,Codes2),
   42   number(Y), !.
   43
   44string2digit(X,Y):-       %%% trick to convert atoms into numbers
   45   name(X,Codes), 
   46   name(Y,Codes),
   47   number(Y), !.
   48
   49
   50/*========================================================================
   51   Converting strings to score
   52========================================================================*/
   53
   54string2score(X,Y):-      
   55   name(X,[N1|Codes]),
   56   N1 > 47, N1 < 58,
   57   append(_,[45,N2|_],Codes),
   58   N2 > 47, N2 < 58, !, Y=X.
   59
   60
   61/*========================================================================
   62   Look-up table
   63========================================================================*/
   64
   65s2d(zero,0).
   66s2d(one,1).
   67s2d(two,2).
   68s2d(three,3).
   69s2d(four,4).
   70s2d(five,5).
   71s2d(six,6).
   72s2d(seven,7).
   73s2d(eight,8).
   74s2d(nine,9).
   75s2d(ten,10).
   76s2d(eleven,11).
   77s2d(twelve,12).
   78s2d(thirteen,13).
   79s2d(fourteen,14).
   80s2d(fifteen,15).
   81s2d(sixteen,16).
   82s2d(seventeen,17).
   83s2d(eighteen,18).
   84s2d(nineteen,19).
   85s2d(twenty,20).
   86s2d(thirty,30).
   87s2d(forty,40).
   88s2d(fifty,50).
   89s2d(sixty,60).
   90s2d(seventy,70).
   91s2d(eighty,80).
   92s2d(ninety,90).
   93s2d(hundred,100).
   94s2d(thousand,1000).
   95s2d(million,1000000).
   96s2d(billion,1000000000).
   97s2d(trillion,1000000000000)