Es ist vergleichsweise einfach, einen kontextsensitiven Parser in Prolog . Dieses Programm parst die Zeichenkette [a,is,less,than,b,and,b,is,less,than,c]
und wandelt sie um in [a,<,b,<,c]
:
:- initialization(main).
:- set_prolog_flag('double_quotes','chars').
main :-
rewrite_system([a,is,less,than,b,and,b,is,less,than,c],X),writeln('\nFinal output:'),writeln(X).
rewrite_rule([[A,<,B],and,[B,<,C]],[A,<,B,<,C]).
rewrite_rule([A,is,less,than,B],[A,<,B]).
rewrite_rule([[A,<,B],and,C,than,D],[[A,<,B],and,A,is,C,than,D]).
rewrite_rule([A,<,B],[[A,<,B]]).
rewritten(A) :- atom(A);bool(A).
bool(A) :- atom(A).
bool([A,<,B,<,C]) :- atom(A),atom(B),atom(C).
bool([A,and,B]) :- bool(A),bool(B).
% this predicate is from https://stackoverflow.com/a/8312742/975097
replace(ToReplace, ToInsert, List, Result) :-
once(append([Left, ToReplace, Right], List)),
append([Left, ToInsert, Right], Result).
rewrite_system(Input,Output) :-
rewritten(Input),Input=Output;
rewrite_rule(A,B),
replace(A,B,Input,Input1),
writeln(Input1),
rewrite_system(Input1,Output).
Unter Verwendung desselben Algorithmus habe ich auch eine adaptiver Parser die aus ihrer Eingabe neue Umschreibregeln "lernt".
0 Stimmen
Ok, diese Regel bedeutet, dass wir den Kontext speichern müssen, in dem die kontextfreie Grammatik wie A --> BC aussieht, für weitere Informationen: de.wikipedia.org/wiki/Chomsky_hierarchy
0 Stimmen
@Bart: "Im Kontext von x und y kann A durch B ersetzt werden".
0 Stimmen
@Ira, danke für die Klarstellung!
0 Stimmen
xAy --> xBy
könnte wahrscheinlich in eine Bestimmungssatzgrammatik in Prolog.