Das Wort-für-Wort Übersetzungsprogramm in Prolog

% liest Output des Tokenizers

% X= Dateiname
% N= Zähler (Wird benötigt um festzustellen, ob zu übersetzendes Token
% das erste Token eines Satzes ist)

uebersetze(X):-
repeat,
see(X),
read(Y),
N is 1,
%tell('wfw.txt'), % auskommentieren, falls Ausgabe auf den Bildschirm gewünscht
translate(Y,N),
nl,
Y==[],
seen,
told,
!.
 

% Übersetzungsprädikate

% Abbruchbedingung

translate([],_).
 

% Übersetzt Token, falls: erstes Token des Satzes und nicht im Lexikon

translate([D|DRest],N):-
  findall(E,change(D,E),Resultat),
  laenge(Resultat,Laenge),
  Laenge=0,
  N=1,
  !,
  gross1(D),
  put(32),
  NN is N+1,
translate(DRest,NN).

% Übersetzt Token, falls: nicht erstes Token des Satzes und
% nicht im Lexikon

translate([D|DRest],N):-
  findall(E,change(D,E),Resultat),
  laenge(Resultat,Laenge),
  Laenge=0,
  N=\=1,
  !,
  write(D),
  put(32),
  NN is N+1,
translate(DRest,NN).

% Übersetzt Token, falls: erstes Token des Satzes und mehrdeutig

translate([D|DRest],N):-
  findall(E,change(D,E),Resultat),
  laenge(Resultat,Laenge),
  Laenge>=2,
  N=1,
  !,
  write('{'),
  gross2(Resultat),
  write('}'), put(32),
  NN is N+1,
translate(DRest,NN).

% Übersetzt Token, falls: nicht erstes Token des Satzes und mehrdeutig

translate([D|DRest],N):-
  findall(E,change(D,E),Resultat),
  laenge(Resultat,Laenge),
  Laenge>=2,
  N=\=1,
  !,
  write('{'),
  ausgabe(Resultat),
  write('}'), put(32),
  NN is N+1,
translate(DRest,NN).

% Übersetzt Token, falls: erstes Token des Satzes und eindeutig

translate([D|DRest],N):-
  change(D,E),
  N=1,
  !,
  gross1(E),
  put(32),
  NN is N+1,
translate(DRest,NN).

% Übersetzt Token, falls: nicht erstes Token des Satzes und eindeutig

translate([D|DRest],N):-
  change(D,E),
  N=\=1,
  !,
  write(E), put(32),
  NN is N+1,
translate(DRest,NN).
 

% sorgt für hübsche Ausgabe von mehrdeutigen Tokens

ausgabe([]).

ausgabe([X|Rest]):-
  laenge(Rest,RLaenge),
  RLaenge>=1,
  write(X),
  write(','), put(32),
ausgabe(Rest).

ausgabe([X|Rest]):-
  laenge(Rest,RLaenge),
  RLaenge=0,
  write(X),
ausgabe(Rest).
 

% Sorgt für Grossschreibung des ersten Zeichens des ersten Tokens
% im Satz, falls: erstes Token nicht mehrdeutig und erstes
% Zeichen = alphabetisch

gross1(D):-
  name(D,[EAscii|RAscii]),
  EAscii >=97,
  EAscii =<122,
  !,
  NEAscii is EAscii-32,
  name(GrossD,[NEAscii|RAscii]),
  write(GrossD).

% Falls erstes Zeichen des ersten Tokens nicht alphabetisch

gross1(D):-
  write(D).
 

% Sorgt für Grossschreibung des ersten Zeichens des ersten Tokens
% im Satz, falls: erstes Token mehrdeutig und erstes
% Zeichen = alphabetisch. Sorgt ausserdem für hübsche Darstellung
% (wie Ausgabe).

gross2([]).

gross2([D|Rest]):-
  name(D,[EAscii|RAscii]),
  NEAscii is EAscii-32,
  name(GrossD,[NEAscii|RAscii]),
  laenge(Rest,RLaenge),
  RLaenge>=1,
  write(GrossD),
  write(','), put(32),
gross2(Rest).

gross2([D|Rest]):-
  name(D,[EAscii|RAscii]),
  NEAscii is EAscii-32,
  name(GrossD,[NEAscii|RAscii]),
  laenge(Rest,RLaenge),
  RLaenge=0,
  write(GrossD),
gross2(Rest).
 

% Hilfsprädikat (bestimmt Länge einer Liste)

laenge([],0).

laenge([_|R],Y):-
laenge(R,RL),
Y is RL + 1.

Zurück zum Wort-für-Wort Übersetzungssystem
Zurück zur Startseite

* * *