Я думаю, что вы уже прошли 90% пути с оригинальным кодом.Я не знаю, что вы хотите проанализировать, поэтому я придумал следующее:
s(xxy(X,Y)) --> v(X), v(X), c(Y).
s(xyx(X,Y)) --> v(X), c(Y), c(X).
v(quiet) --> line(quiet).
v(loud) --> line(loud).
c(quiet) --> line(quiet).
c(loud) --> line(loud).
line(quiet) --> ['laa!'].
line(loud) --> ['LAA!'].
Как вы можете видеть, единственное существенное изменение здесь - это изменение s//0
на s//1
и возвращение чего-тос переменными X и Y (которые ранее были синглетонами в любом случае).Пример использования его для анализа всех ваших предложений:
?- phrase(s(Parse), Sentence).
Parse = xxy(quiet, quiet),
Sentence = ['laa!', 'laa!', 'laa!'] ;
Parse = xxy(quiet, loud),
Sentence = ['laa!', 'laa!', 'LAA!'] ;
Parse = xxy(loud, quiet),
Sentence = ['LAA!', 'LAA!', 'laa!'] ;
Parse = xxy(loud, loud),
Sentence = ['LAA!', 'LAA!', 'LAA!'] ;
Parse = xyx(quiet, quiet),
Sentence = ['laa!', 'laa!', 'laa!'] ;
Parse = xyx(quiet, loud),
Sentence = ['laa!', 'LAA!', 'laa!'] ;
Parse = xyx(loud, quiet),
Sentence = ['LAA!', 'laa!', 'LAA!'] ;
Parse = xyx(loud, loud),
Sentence = ['LAA!', 'LAA!', 'LAA!'].
Чтобы дать вам больше помощи, мне, вероятно, придется узнать больше о промежуточном представлении, которое вы хотите получить, но, надеюсь, это проиллюстрирует идею,Вы были уже так близко!