Die allgemeine Idee ist es, die Kanten beim Parsen hinten an die Datenbank anzufügen (assertz), so dass die älterten Kanten zuoberst in der Datenbank stehen. Diese lese ich der Reihe nach aus und zeichne sie wie folgt. Die Position jedes Knotens und Wortes multipliziere ich mit einem Faktor (sagen wir 5). Dann sieht die Chart so aus:
(Pos 0 5 10 15 20 25 30)
0 mia 1 shot 2 vincent 3
|------pn-------|
Dann zeichne ich die erste Kante und merke mir in einem dynamischen Prädikat den rechten Rand meiner aktuellen Zeile (also 10). Wenn ich nun als nächste Kante eine Kante bekomme, die rechts vom aktuellen Rand beginnt (also an Pos 10 oder größer), zeichne ich sie dazu und setze den Rechten Rand entsprechend hoch, z.B.:
(Pos 0 5 10 15 20 25 30)
0 mia 1 shot 2 vincent 3
|------pn-------||--------------vp--------------|
Nun ist der Rechte Rand 30. Wenn ich jetzt eine Kante bekomme, deren Startposition kleiner als 30 ist, gehe ich in eine neue Zeile, setze den Rechten Rand auf 0 und zeichne die Kante:
(Pos 0 5 10 15 20 25 30)
0 mia 1 shot 2 vincent 3
|------pn-------||--------------vp--------------|
|------np-------|
Nun ist der Rechte Rand 10. Und so weiter. Damit bekommt man eine ganz gut aussehende Chart. Man kann noch ein Bisschen mit den Abständen spielen, da der Computer nicht an dieselbe Position zeichnen kann und sich die Kanten dann um einen Punkt nach rechts verschieben, aber das ist nicht tragisch. Nun gebe ich euch meinen Code, der die Worte zeichnet und ihr könnt entlang diesem Beispiel das Prädikat 'print_arcs' ergänzen.
:- ['passive_chart_bottomup.pl','ourEng.pl'].
% der rechte Rand
:- dynamic(chartTab/1).
(
% der Faktor, der die Pos. bestimmt.
)
tabulator(7).
print_chart :-
nl,
print_words,
retractall(chartTab(_)),
assert(chartTab(0)),
print_arcs.
print_chart.
print_words :-
retract(scan(From,_,Word)),
tabulator(Tabulator),
NodeTab is 2 * From * Tabulator,
% mache aus der Zahl NodeTab den String NodeTabChar
number_codes(NodeTab,NodeTabChar),
WordTab is NodeTab + Tabulator,
number_codes(WordTab,WordTabChar),
% erzeuge z.B. "~14|~w" für NodeTab=14
append([126|NodeTabChar],"|~w",FS1),
append([126|WordTabChar],"|~w",FS2),
append(FS1,FS2,FS),
format(FS,[From,Word]),
fail.
print_words :- nl.
% Von Euch zu ergänzen!!!
print_arcs.
% Aufruf
(
%:- chart_recognize_bottomup([mia,who,shot,the,robber,died]),print_chart.
)