-
Notifications
You must be signed in to change notification settings - Fork 0
/
addition.pl
51 lines (31 loc) · 1.13 KB
/
addition.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
%% 6.2.1 Term rewriting systems
:- use_module(library(chr)).
:- op(600, xfx, eq).
:- chr_constraint eq/2, unflatten/0.
%% TRS:
%% 0+Y -> Y.
%% s(X)+Y -> s(X+Y).
%% N.B. We need `eq` instead of `=`, because `=` is built-in constraint
%% which cannot be manipulated in CHR.
T eq T1+T2, T1 eq 0, T2 eq Y <=> T eq Y.
T eq T1+T2, T1 eq s(T3), T3 eq X, T2 eq Y <=> T eq s(T4), T4 eq T5+T6, T5 eq X, T6 eq Y.
%% TRS: 0+s(0)
%% ------> T eq 0+s(0)
%% --cps-> T eq T1+T2, T1 eq 0, T2 eq s(0).
%% --cps-> T eq T1+T2, T1 eq 0, T2 eq s(T3), T3 eq 0.
%?- T eq T1+T2, T1 eq 0, T2 eq s(T3), T3 eq 0.
%@ $VAR(T3)eq 0,
%@ $VAR(T)eq s($VAR(T3)).
%% TRS: s(0)+s(0)
%% ------> T eq 0+1.
%% --cps-> T eq T1+T2, T1 eq s(T2), T2 eq 0, T2 eq s(T4), T4 eq 0.
%?- T eq T1+T2, T1 eq s(T2), T2 eq 0, T2 eq s(T4), T4 eq 0.
%@ $VAR(_A)eq 0,
%@ $VAR(_B)eq s($VAR(_A)),
%@ $VAR(T)eq s($VAR(_B)).
%% unflatten
unflatten @ unflatten \ T eq T1 <=> T = T1.
%?- T eq T1+T2, T1 eq s(T2), T2 eq 0, T2 eq s(T4), T4 eq 0, unflatten.
%@ T = s(s(0)),
%@ unflatten.
%% TODO: create cps transformation rule/predicate for term