Last active
May 16, 2023 18:22
-
-
Save GeoffChurch/27d62f6a8df03a75d37714cca8a0537d to your computer and use it in GitHub Desktop.
Declarative catamorphism with meta-language escapes which can be used e.g. to solve for variable bindings in the codomain.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
unescape(\X, X). % Subterms, and in particular logic variables, can be marked as pre-evaluated. | |
cata(Alg) --> unescape *-> {} ; mapargs(cata(Alg)), call(Alg). | |
% Example: | |
alg( 0 + 0, 0). | |
alg( 0 + 1, 1). | |
alg( 1 + 0, 1). | |
alg( 1 + 12, 13). | |
alg( 2 + 2, 4). | |
alg( 2 + 3, 5). | |
alg( 3 + 10, 13). | |
alg( 0 * 1, 0). | |
alg( 1 * 0, 0). | |
alg( 2 * 5, 10). | |
alg( 3 * 4, 12). | |
unify_images(Term1, Term2) :- | |
cata(alg, Term1, Image), | |
cata(alg, Term2, Image). | |
% ?- unify_images(alg, \X + \Y * (\Z + \Z), \Y + \Z * (\Z + \Y)). | |
% X = Y, Y = 1, | |
% Z = 0 ; | |
% X = 1, | |
% Y = 3, | |
% Z = 2 ; | |
% false. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
unescape/2
is "semidet" (succeeding at most once), so the*->
(soft-cut) is equivalent to->
, but*->
makes the purity more obvious.