Prolog implementation of the
Knuth-Bendix completion procedure
Prolog code:
trs.pl
Video: |
|
As an application of term rewriting, consider for example the
completion of the
group axioms:
?- Es = [X*(Y*Z)=(X*Y)*Z, e*X=X, i(X)*X=e],
functors_order([*,e,i], Order),
completion(Es, Order, [], [], Rs),
maplist(portray_clause, Rs).
Or shorter, using the interface predicate
equations_trs/2
to relate a list of
identities to a convergent term
rewriting system (TRS):
?- equations_trs([X*(Y*Z)=(X*Y)*Z, e*X=X, i(X)*X=e], Rs),
maplist(portray_clause, Rs).
This yields the following
convergent TRS:
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.
We can use this TRS to reduce—for example—the
term
X*i(X) to its
normal form:
?- equations_trs([X*(Y*Z)=(X*Y)*Z, e*X=X, i(X)*X=e], Rs),
normal_form(Rs, X*i(X), NF).
Gs = ...,
Rs = ...,
NF = e .
This shows that the left-inverse is also a right-inverse
in groups!
To
decide equality between any two terms
in groups, simply reduce both of them to their respective
normal forms, and see whether they are identical. This only takes
a finite number of steps, since the TRS is convergent
and hence
terminating.
Read
The Power of Prolog
to understand the Prolog language features that are used in
the code. In particular, I recommend the following chapters:
Please write
to
triska@metalevel.at if
you have any questions about this code or any other
aspects.
Main page