1
2%%% The following code has been produced by the CHR compiler
3
4
5:- ( current_module(chr) -> true ; use_module(library(chr)) ).
6
7:- get_flag(variable_names, Val), setval(variable_names_flag, Val), set_flag(variable_names, off).
8:- local (=:=) / 2.
9:- op(100, xfx, equals).
10:- ['math-utilities'].
11A =:= B :-
12	'CHRgen_num'(C),
13	coca(add_one_constraint(C, A =:= B)),
14	'CHR=:=_2'(A =:= B, D, E, C).
15
16
17
18%%% Rules handling for =:= / 2
19
20'CHR=:=_2'(A =:= B, C, D, E) :-
21	(
22	    'CHRnonvar'(C)
23	;
24	    'CHRalready_in'('CHR=:=_2'(A =:= B, C, D, E)),
25	    coca(already_in)
26	),
27	!.
28'CHR=:=_2'(A =:= B, C, D, E) ?-
29	coca(try_rule(E, A =:= B, normalize, F =:= G, replacement, true, (normalize(F, G, H, I), equals(H, I)))),
30	!,
31	'CHRkill'(C),
32	coca(fired_rule(normalize)),
33	normalize(A, B, J, K),
34	equals(J, K).
35'CHR=:=_2'(A =:= B, C, D, E) :-
36	'CHR=:=_2__0'(A =:= B, C, D, E).
37:- set_flag('CHR=:=_2' / 4, leash, notrace).
38:- current_macro('CHR=:=_2' / 4, _1353, _1354, _1355) -> true ; define_macro('CHR=:=_2' / 4, tr_chr / 2, [write]).
39'CHR=:=_2__0'(A, B, C, D) :-
40	'CHR=:=_2__1'(A, B, C, D).
41:- set_flag('CHR=:=_2__0' / 4, leash, notrace).
42'CHR=:=_2__1'(A =:= B, C, D, E) :-
43	(
44	    'CHRvar'(C)
45	->
46	    'CHRdelay'([C, A =:= B], 'CHR=:=_2'(A =:= B, C, D, E))
47	;
48	    true
49	).
50:- set_flag('CHR=:=_2__1' / 4, leash, notrace).
51equals(A, B) :-
52	'CHRgen_num'(C),
53	coca(add_one_constraint(C, equals(A, B))),
54	'CHRequals_2'(equals(A, B), D, E, C).
55
56
57
58%%% Rules handling for equals / 2
59
60'CHRequals_2'(equals(A, B), C, D, E) :-
61	(
62	    'CHRnonvar'(C)
63	;
64	    'CHRalready_in'('CHRequals_2'(equals(A, B), C, D, E)),
65	    coca(already_in)
66	),
67	!.
68'CHRequals_2'(equals(A, B), C, D, E) ?-
69	'CHRget_delayed_goals'(true, F),
70	'CHRequals_2__3'(F, [], [G, H, I, J], K),
71	coca(try_double(E, equals(A, B), K, equals([J * I|H], G), equals(L, M), equals([N * O|P], Q), keep_second, delete(N * R, L, S), (is_div(R, O, T), mult_const(eq0(Q, P), T, eq0(U, V)), add_eq0(eq0(M, S), eq0(U, V), eq0(W, X)), equals(X, W)), eliminate)),
72	no_global_bindings(delete(J * Y, A, Z), (equals(A, B), equals([J * I|H], G))),
73	!,
74	'CHRkill'(C),
75	coca(fired_rule(eliminate)),
76	is_div(Y, I, A1),
77	mult_const(eq0(G, H), A1, eq0(B1, C1)),
78	add_eq0(eq0(B, Z), eq0(B1, C1), eq0(D1, E1)),
79	equals(E1, D1).
80'CHRequals_2'(equals(A, B), C, D, E) :-
81	'CHRequals_2__2'(equals(A, B), C, D, E).
82'CHRequals_2__3'(['CHRequals_2'(equals([A * B|C], D), E, F, G)|H], [], [I, J, K, L], M) ?-
83	'CHRvar'(E),
84	'CHR='([D, C, B, A], [I, J, K, L]),
85	'CHR='(G, M).
86'CHRequals_2__3'([A|B], C, D, E) :-
87	'CHRequals_2__3'(B, C, D, E).
88:- set_flag('CHRequals_2__3' / 4, leash, notrace).
89:- set_flag('CHRequals_2' / 4, leash, notrace).
90:- current_macro('CHRequals_2' / 4, _2599, _2600, _2601) -> true ; define_macro('CHRequals_2' / 4, tr_chr / 2, [write]).
91'CHRequals_2__2'(A, B, C, D) :-
92	'CHRequals_2__4'(A, B, C, D).
93:- set_flag('CHRequals_2__2' / 4, leash, notrace).
94'CHRequals_2__4'(equals([A * B|C], D), E, F, G) ?-
95	'CHRvar'(E),
96	!,
97	'CHRget_delayed_goals'(true, H),
98	'CHRequals_2__4__5'(H, E, equals([A * B|C], D), F, G).
99'CHRequals_2__4'(equals(A, B), C, D, E) :-
100	'CHRequals_2__4__6'(equals(A, B), C, D, E).
101:- set_flag('CHRequals_2__4' / 4, leash, notrace).
102'CHRequals_2__4__5'(['CHRequals_2'(equals(A, B), C, D, E)|F], G, equals([H * I|J], K), L, M) ?-
103	'CHRvar'(C),
104	coca(try_double(M, equals([H * I|J], K), E, equals(A, B), equals([N * O|P], Q), equals(R, S), keep_first, delete(N * T, R, U), (is_div(T, O, V), mult_const(eq0(Q, P), V, eq0(W, X)), add_eq0(eq0(S, U), eq0(W, X), eq0(Y, Z)), equals(Z, Y)), eliminate)),
105	no_global_bindings(delete(H * A1, A, B1), (equals([H * I|J], K), equals(A, B))),
106	!,
107	'CHRkill'(C),
108	coca(fired_rule(eliminate)),
109	'CHRequals_2__4__5'(F, G, equals([H * I|J], K), L, M),
110	is_div(A1, I, C1),
111	mult_const(eq0(K, J), C1, eq0(D1, E1)),
112	add_eq0(eq0(B, B1), eq0(D1, E1), eq0(F1, G1)),
113	equals(G1, F1).
114'CHRequals_2__4__5'([A|B], C, D, E, F) :-
115	'CHRequals_2__4__5'(B, C, D, E, F).
116'CHRequals_2__4__5'([], A, B, C, D) :-
117	'CHRequals_2__4__6'(B, A, C, D).
118:- set_flag('CHRequals_2__4__5' / 5, leash, notrace).
119'CHRequals_2__4__6'(equals(A, B), C, D, E) :-
120	(
121	    'CHRvar'(C)
122	->
123	    'CHRdelay'([C, equals(A, B)], 'CHRequals_2'(equals(A, B), C, D, E))
124	;
125	    true
126	).
127:- set_flag('CHRequals_2__4__6' / 4, leash, notrace).
128
129:- getval(variable_names_flag, Val), set_flag(variable_names, Val).
130