This program implements the Knuth-Bendix completion procedure.
Project page: https://www.metalevel.at/trs/
As one possible application, consider the group axioms:
group([e*X = X,
i(X)*X = e,
A*(B*C)= (A*B)*C]).
To obtain a convergent TRS for these equations, use:
?- group(Es), equations_trs(Es, Rs), maplist(portray_clause, Rs).
In this case, you obtain the oriented rewrite rules:
i(A*B)==>i(B)*i(A).
A*i(A)==>e.
i(i(A))==>A.
A*e==>A.
A*B*C==>A*(B*C).
i(A)*A==>e.
e*A==>A.
i(A)*(A*B)==>B.
i(e)==>e.
A*(i(A)*B)==>B.
You can use these rewrite rules to decide the word problem in groups: determining whether two terms are equal.
You can apply these rules with normal_form/3
. For example:
?- group(Es),
equations_trs(Es, Rs),
normal_form(Rs, e*i(i(e)), NF).
...
NF = e .