Did you know ... | Search Documentation: |
![]() | Packs (add-ons) for SWI-Prolog |
Title: | Finite domain semantic unification |
---|---|
Rating: | Not rated. Create the first rating! |
Latest version: | 0.1 |
SHA1 sum: | 3f747c37a3f4ac9ae3d413f41beca6f14d0748af |
Author: | Geoffrey Churchill <geoffrey.a.churchill@gmail.com> |
Home page: | https://github.com/GeoffChurch/eunify |
No reviews. Create the first review!.
Version | SHA1 | #Downloads | URL |
---|---|---|---|
0.1 | 3f747c37a3f4ac9ae3d413f41beca6f14d0748af | 2 | https://github.com/GeoffChurch/eunify/archive/0.1.zip |
eunify
eunify
implements E-unification#E-unification) for SWI-Prolog. Set the free algebra free with eunify
today.
The core predicate is eunify
, implemented as
eunify(Alg, X = Y) => cata(apply_alg(Alg), X, Z), cata(apply_alg(Alg), Y, Z).
It uses cata
to recursively evaluate both X and Y to Z using the user-defined algebra.
In the case of a finite algebra (i.e. the functions map into a finite carrier set), we can leverage the CLP(FD) constraint solver. For example, the natural numbers modulo 2 are described by the following algebra:
?- pairs_to_clpfd_alg([z-0, s(0)-1, s(1)-0], _Alg), rb_visit(_Alg, Pairs). Pairs = [s/1-i_o_state([_C], _D, []), z/0-i_o_state([], 0, [])], _E in 0..1, _E#\/_F#<==>1, _G#/\_H#<==>_E, _G in 0..1, _C#=1#<==>_G, _C#=0#<==>_I, _H in 0..1, _D#=0#<==>_H, _D#=1#<==>_J, _F in 0..1, _I#/\_J#<==>_F, _I in 0..1, _J in 0..1.
Looking at Pairs, z/0 maps to i_o_state([], 0, [])
, which describes a function that takes no arguments (the first []
) and returns a 0
. s/1 maps to i_o_state([_C], _D, [])
, which describes a function that takes a single argument (bound to _C) and returns _D. _C and _D are related by the list of constraints printed out under Pairs. Both of the i_o_state
terms have an empty list as their "state". This is because the algebra itself has no variables, unlike the following, which binds logic variables X and Y to the internal identifiers x
and y
:
?- pairs_to_clpfd_alg([x-X, y-Y, f(0,1)-1], _Alg), rb_visit(_Alg, Pairs). Pairs = [f/2-i_o_state([0, 1], 1, []), x/0-i_o_state([], X, [X]), y/0-i_o_state([], Y, [Y])], X in inf..sup, Y in inf..sup.
We can determine values for X and Y, thereby grounding the states:
?- pairs_to_clpfd_alg([x-X, y-Y, f(0,1)-1], _Alg), rb_visit(_Alg, Pairs), eunify(_Alg, f(x, y) = ?(Z)). X = 0, Y = Z, Z = 1, Pairs = [f/2-i_o_state([0, 1], 1, []), x/0-i_o_state([], 0, [0]), y/0-i_o_state([], 1, [1])].
A technical note: the operations in the algebra can be partial (undefined for some inputs) and/or nondeterministic (f(1)
could nondeterministically return 2
or 3
). For example, the following succeeds because f(a, a)
can evaluate to f(0, 1)
and hence to 1
: pairs_to_clpfd_alg([a-0, a-1, f(0,1)-1], _Alg), eunify(_Alg, f(a, a) = ?(1))
.
To install: ?- pack_install(eunify)
.
Pack contains 5 files holding a total of 40.4K bytes.