Prólogo: DCGS - Conversión de números a inglés

Estoy practicando el uso de DCG en Prolog. Tomo un número entero como 123, lo 'exploto' en una lista, es decir, [1,2,3] y luego quiero usar las reglas DCG para obtener el resultado uno-dos-tres. Hasta ahora puedo convertir una lista de un entero, por ejemplo, [1] en uno, pero no sé qué hacer cuando se trata de una lista. Quiero usar DCG tanto como sea posible, ya que esto es lo que estoy practicando. Aquí está mi código actual:

tests( 1, [1] ).
tests( 2, [67] ).
tests( 3, [183] ).
tests( 4, [999] ).  

numToEng( N, Res ) :-
    tests( N, W ),
    print( 'test: ' ),print( W ),nl,
    explode( W, Exploded ),
    print( 'exploded: ' ),print( Exploded ),nl,
    phrase( num(Res), Exploded ).

explode( N, Explosion ) :-
    explode( N, [], Explosion ).
explode( 0, Explosion, Explosion ) :- !.    
explode( N, Inter, Explosion ) :- 
    Test is N mod 10, 
    NewN0 is  N - Test,
    NewN1 is NewN0//10, 
    explode( NewN1, [Test|Inter], Explosion ).

num( X ) --> digit( X ).    

digit(zero) --> [0].
digit(one) --> [1].
digit(two) --> [2].
digit(three) --> [3].
digit(four) --> [4].
digit(five) --> [5].
digit(six) --> [6].
digit(seven) --> [7].
digit(eight) --> [8].
digit(nine) --> [9].

Una posible solución SIN usar DCG es lo que he escrito antes, pero me pregunto cómo escribirlo usando DCG.

% test cases, called by numToEng/2
tests( 1, [1] ).
tests( 2, [67] ).
tests( 3, [183] ).
tests( 4, [999] ).

% dictionary
digit(0,zero).
digit(1,one).
digit(2,two).
digit(3,three).
digit(4,four).
digit(5,five).
digit(6,six).
digit(7,seven).
digit(8,eight).
digit(9,nine).

% take an integer e.g. 123 and explode it
% into a list i.e. [1,2,3]
explode( N, Explosion ) :-
    explode( N, [], Explosion ).
explode( 0, Explosion, Explosion ) :- !.    
explode( N, Inter, Explosion ) :- 
    Test is N mod 10, 
    NewN0 is  N - Test,
    NewN1 is NewN0//10, 
    explode( NewN1, [Test|Inter], Explosion ).

% take a number in digits and convert it
% into english e.g. [1,2,3] would be
% [one,two,three]   
numToEng( N, Res ) :-
    tests( N, Test ),
    explode( Test, Exploded ),
    numToEng( N, Exploded, [], Res ).
numToEng( _, [], Rev, Res ) :-
    reverse( Rev, Res ).
numToEng( N, [H|T], Inter, Res ) :-
    digit( H, Word ),
    numToEng( N, T, [Word|Inter], Res ).

preguntado el 08 de enero de 11 a las 22:01

Hola, lo siento, básicamente quiero convertir un número entero en una lista de palabras en inglés para que 123 se convierta en [uno, dos, tres]. Quiero poder hacer esto usando las reglas gramaticales de DCG. He dado un ejemplo que no es de DCG para que pueda ver lo que quiero. Creo que esto se puede resolver usando las reglas de DCG. ¿Es suficiente información? Gracias. -

1 Respuestas

digits([]) --> [].
digits([D|Ds]) --> digit(D), digits(Ds).

Ejemplo:

?- explode(123,X), digits(Digits,X,[]).
X = [1, 2, 3],
Digits = [one, two, three]

Respondido el 10 de enero de 11 a las 15:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.