% Parser fuer die Zahlen 0 bis 999, auf Englisch % Nach Sterling & Shapiro: The Art of Prolog, MIT Press, 1987. % `\' als Infixoperator :- op(500, yfx, [\]). % Hauptprogramm parse(N, S) :- number(N, S\[]). % Implementierung mit Differenzlisten number(0, [zero|S]\S). number(N, S\S0) :- xxx(N, S\S0). % Zahlen mit bis zu drei Stellen xxx(N, S\S0) :- digit(D, S\S1), S1 = [hundred|S2], rest_xxx(N1, S2\S0), N is D*100+N1. xxx(N, S\S0) :- xx(N, S\S0). rest_xxx(0, S\S). rest_xxx(N, [and|S]\S0) :- xx(N, S\S0). % Zahlen mit bis zu zwei Stellen xx(N, S\S0) :- digit(N, S\S0). xx(N, S\S0) :- teen(N, S\S0). xx(N, S\S0) :- tens(T, S\S1), rest_xx(N1, S1\S0), N is T+N1. rest_xx(0, S\S). rest_xx(N, S\S0) :- digit(N, S\S0). % Terminale digit(1, [one|S]\S). digit(2, [two|S]\S). digit(3, [three|S]\S). digit(4, [four|S]\S). digit(5, [five|S]\S). digit(6, [six|S]\S). digit(7, [seven|S]\S). digit(8, [eight|S]\S). digit(9, [nine|S]\S). teen(10, [ten|S]\S). teen(11, [eleven|S]\S). teen(12, [twelve|S]\S). teen(13, [thirteen|S]\S). teen(14, [fourteen|S]\S). teen(15, [fifteen|S]\S). teen(16, [sixteen|S]\S). teen(17, [seventeen|S]\S). teen(18, [eighteen|S]\S). teen(19, [nineteen|S]\S). tens(20, [twenty|S]\S). tens(30, [thirty|S]\S). tens(40, [forty|S]\S). tens(50, [fifty|S]\S). tens(60, [sixty|S]\S). tens(70, [seventy|S]\S). tens(80, [eighty|S]\S). tens(90, [ninety|S]\S).