Почему мы используем '!' в прологе

Это код, который я пытаюсь понять.

co(X) :- co(X,[],L).
co([],A,A):- write(A).
co([X|Xs], A, L) :- p(X-Z,A,R), !, Z1 is Z+1, co(Xs, [X-Z1|R], L). 
co([X|Xs], A, L) :- co(Xs, [X-1|A], L). 

p(X-Y,[X-Y|R],R):- !.
p(X,[H|Y], [H|Z]) :- p(X,Y,Z).

Какая польза от "!" и предикат p (,,) в приведенном выше коде. ИЛИ Кто-нибудь может просто добавить комментарии на каждом шаге приведенного выше кода, чтобы я мог понять. Благодарю.

Ответы на вопрос(2)

Ваш ответ на вопрос