Это поможет с количеством применений правил для успешного разбора. Однако, как вы можете видеть, это всегда будет то же число, что и количество слов в предложении. Что я сделал, так это внедрил «counter» в параметрах каждого правила, и каждый раз, когда «базовое правило» исполняется, оно увеличивает значение «counter».
det([i|W], W, A, R) :- R is A + 1.
det([a|W], W, A, R) :- R is A + 1.
det([in|W], W, A, R) :- R is A + 1.
n([tutorial|W], W, A, R) :- R is A + 1.
n([library|W], W, A, R) :- R is A + 1.
v([went|W], W, A, R):- R is A + 1.
v([saw|W], W, A, R):- R is A + 1.
np([], R, R).
np(X, A, R2):- det(X, Y, A, R), np(Y, R, R2).
np(X, A, R3):- det(X, Y, A, R), n(Y, Z, R, R2), np(Z, R2, R3).
vp(X, Z, R2):- det(X, Y, 0, R), v(Y, Z, R, R2).
s(X, R2):- atomic_list_concat(L,' ', X), vp(L, Z, R), np(Z, R, R2), !.
Вот результаты . Results.
Как вы можете видеть, последнее предложение все еще не выполнено, потому что если вы будете следовать потоку алгоритм или вызовы этого вы можете видеть, что правило 's' вызывает правило 'vp', которое допускает только 'det', за которым следует 'v', поэтому, если вы видите первое слово третьего предложения, которое 'In' 'det' в 'vp' будет работать, но следующее слово, которое 'библиотека', не будет успешным на 'v', потому что 'библиотека' не глагол, поэтому она терпит неудачу. В заключение, если вы хотите, чтобы третье предложение было успешным, вам придется внести некоторые изменения в свои грамматики. Между прочим, есть лучший способ, возможно, немного более сложный для достижения, но как только вы поймете, как его использовать, будет быстрее работать и проще создать сложную грамматику, используя Prolog DCG https://www.swi-prolog.org/pldoc/man?section=DCG. Я упоминал на случай, если вы не знали об этом.