2011-01-08 14 views
1

Ich übe mit DCGs in Prolog. Ich nehme eine Ganzzahl wie 123, "explode" sie in eine Liste, d. H. [1,2,3] und dann möchte ich DCG-Regeln verwenden, um die Ausgabe eins-zwei-drei zu erhalten. Bis jetzt kann ich eine Liste einer ganzen Zahl, z. [1] in einen, aber ich weiß nicht, was ich tun soll, wenn es um eine Liste geht. Ich möchte so viel wie möglich mit DCGs arbeiten, da ich das gerade praktiziere. Hier ist mein aktueller Code:Prolog: DCGS - Konvertieren von Zahlen in Englisch

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]. 

Eine mögliche Lösung OHNE DCGs mit ist das, was ich geschrieben habe, bevor aber ich frage mich, wie es schreiben DCGs verwenden.

% 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). 
+0

Was ist die Frage? –

+1

Hallo, Entschuldigung, im Grunde möchte ich eine ganze Zahl in eine Liste von englischen Wörtern umwandeln, so dass 123 [eins, zwei, drei] wird. Ich möchte dies mit DCG-Grammatikregeln tun können. Ich habe ein Nicht-DCG-Beispiel angegeben, damit Sie sehen können, was ich möchte. Ich denke, dass das mit DCG-Regeln gelöst werden kann? Ist das genug Info? Vielen Dank. – ale

Antwort

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

Beispiel:

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

danke, das ist peinlich offensichtlich: p. – ale

Verwandte Themen