Сравнительно легко написать контекстно-зависимый синтаксический анализатор на Prolog. Эта программа анализирует строку [a,is,less,than,b,and,b,is,less,than,c]
, конвертируя ее в [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).
Используя тот же алгоритм, я также написал адаптивный синтаксический анализатор, который «изучает» новые правила перезаписи на своих входных данных.
person
Anderson Green
schedule
17.03.2019
xAy --> xBy
, вероятно, можно было бы преобразовать в грамматику определенных предложений в Прологе. - person Anderson Green   schedule 04.12.2018