Backport from sid to buster
[hcoop/debian/mlton.git] / benchmark / tests / logic.sml
CommitLineData
7f918cf1
CE
1(* From the SML/NJ benchmark suite. *)
2
3(* term.sml *)
4
5structure Term =
6struct
7 datatype term
8 = STR of string * term list
9 | INT of int
10 | CON of string
11 | REF of term option ref
12
13 exception BadArg of string
14end;
15
16(* trail.sml *)
17
18structure Trail =
19struct
20 local
21 open Term
22 val global_trail = ref (nil : term option ref list)
23 val trail_counter = ref 0
24 in
25 fun unwind_trail (0, tr) = tr
26 | unwind_trail (n, r::tr) =
27 ( r := NONE ; unwind_trail (n-1, tr) )
28 | unwind_trail (_, nil) =
29 raise BadArg "unwind_trail"
30
31 fun reset_trail () = ( global_trail := nil )
32
33 fun trail func =
34 let
35 val tc0 = !trail_counter
36 in
37 ( func () ;
38 global_trail :=
39 unwind_trail (!trail_counter-tc0, !global_trail) ;
40 trail_counter := tc0 )
41 end
42
43 fun bind (r, t) =
44 ( r := SOME t ;
45 global_trail := r::(!global_trail) ;
46 trail_counter := !trail_counter+1 )
47 end (* local *)
48end; (* Trail *)
49
50(* unify.sml *)
51
52structure Unify =
53struct
54 local
55 open Term Trail
56 fun same_ref (r, REF(r')) = (r = r')
57 | same_ref _ = false
58
59 fun occurs_check r t =
60 let
61 fun oc (STR(_,ts)) = ocs ts
62 | oc (REF(r')) =
63 (case !r' of
64 SOME(s) => oc s
65 | _ => r <> r')
66 | oc (CON _) = true
67 | oc (INT _) = true
68 and ocs nil = true
69 | ocs (t::ts) = oc t andalso ocs ts
70 in
71 oc t
72 end
73 fun deref (t as (REF(x))) =
74 (case !x of
75 SOME(s) => deref s
76 | _ => t)
77 | deref t = t
78 fun unify' (REF(r), t) sc = unify_REF (r,t) sc
79 | unify' (s, REF(r)) sc = unify_REF (r,s) sc
80 | unify' (STR(f,ts), STR(g,ss)) sc =
81 if (f = g)
82 then unifys (ts,ss) sc
83 else ()
84 | unify' (CON(f), CON(g)) sc =
85 if (f = g) then
86 sc ()
87 else
88 ()
89 | unify' (INT(f), INT(g)) sc =
90 if (f = g) then
91 sc ()
92 else
93 ()
94 | unify' (_, _) sc = ()
95 and unifys (nil, nil) sc = sc ()
96 | unifys (t::ts, s::ss) sc =
97 unify' (deref(t), deref(s))
98 (fn () => unifys (ts, ss) sc)
99 | unifys _ sc = ()
100 and unify_REF (r, t) sc =
101 if same_ref (r, t)
102 then sc ()
103 else if occurs_check r t
104 then ( bind(r, t) ; sc () )
105 else ()
106 in
107 val deref = deref
108 fun unify (s, t) = unify' (deref(s), deref(t))
109 end (* local *)
110end; (* Unify *)
111
112(* data.sml *)
113
114structure Data =
115struct
116 local
117 open Term Trail Unify
118 val cons_s = "cons"
119 val x_s = "x"
120 val nil_s = "nil"
121 val o_s = "o"
122 val s_s = "s"
123 val CON_o_s = CON(o_s)
124 val CON_nil_s = CON(nil_s)
125 val CON_x_s = CON(x_s)
126 in
127 fun exists sc = sc (REF(ref(NONE)))
128
129fun move_horiz (T_1, T_2) sc =
130(
131trail (fn () =>
132(
133trail (fn () =>
134(
135trail (fn () =>
136(
137trail (fn () =>
138(
139trail (fn () =>
140(
141trail (fn () =>
142(
143trail (fn () =>
144(
145trail (fn () =>
146(
147trail (fn () =>
148(
149trail (fn () =>
150(
151trail (fn () =>
152exists (fn T =>
153exists (fn TT =>
154unify (T_1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, T])])]), TT])) (fn () =>
155unify (T_2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, T])])]), TT])) (fn () =>
156sc ())))))
157;
158exists (fn P1 =>
159exists (fn P5 =>
160exists (fn TT =>
161unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () =>
162unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () =>
163sc ())))))
164))
165;
166exists (fn P1 =>
167exists (fn P2 =>
168exists (fn TT =>
169unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])])])]), TT])) (fn () =>
170unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), TT])) (fn () =>
171sc ())))))
172))
173;
174exists (fn L1 =>
175exists (fn P4 =>
176exists (fn TT =>
177unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () =>
178unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () =>
179sc ())))))
180))
181;
182exists (fn L1 =>
183exists (fn P1 =>
184exists (fn TT =>
185unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])])]), TT])])) (fn () =>
186unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), TT])])) (fn () =>
187sc ())))))
188))
189;
190exists (fn L1 =>
191exists (fn L2 =>
192exists (fn TT =>
193unify (T_1, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])]), TT])])])) (fn () =>
194unify (T_2, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), TT])])])) (fn () =>
195sc ())))))
196))
197;
198exists (fn T =>
199exists (fn TT =>
200unify (T_1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, T])])]), TT])) (fn () =>
201unify (T_2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, T])])]), TT])) (fn () =>
202sc ()))))
203))
204;
205exists (fn P1 =>
206exists (fn P5 =>
207exists (fn TT =>
208unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () =>
209unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () =>
210sc ())))))
211))
212;
213exists (fn P1 =>
214exists (fn P2 =>
215exists (fn TT =>
216unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), TT])) (fn () =>
217unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])])])]), TT])) (fn () =>
218sc ())))))
219))
220;
221exists (fn L1 =>
222exists (fn P4 =>
223exists (fn TT =>
224unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () =>
225unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () =>
226sc ())))))
227))
228;
229exists (fn L1 =>
230exists (fn P1 =>
231exists (fn TT =>
232unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), TT])])) (fn () =>
233unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])])]), TT])])) (fn () =>
234sc ())))))
235))
236;
237exists (fn L1 =>
238exists (fn L2 =>
239exists (fn TT =>
240unify (T_1, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), TT])])])) (fn () =>
241unify (T_2, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])]), TT])])])) (fn () =>
242sc ())))))
243)
244(* | move_horiz _ _ = () *)
245
246and rotate (T_1, T_2) sc =
247exists (fn P11 =>
248exists (fn P12 =>
249exists (fn P13 =>
250exists (fn P14 =>
251exists (fn P15 =>
252exists (fn P21 =>
253exists (fn P22 =>
254exists (fn P23 =>
255exists (fn P24 =>
256exists (fn P31 =>
257exists (fn P32 =>
258exists (fn P33 =>
259exists (fn P41 =>
260exists (fn P42 =>
261exists (fn P51 =>
262unify (T_1, STR(cons_s, [STR(cons_s, [P11, STR(cons_s, [P12, STR(cons_s, [P13, STR(cons_s, [P14, STR(cons_s, [P15, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [P21, STR(cons_s, [P22, STR(cons_s, [P23, STR(cons_s, [P24, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [P31, STR(cons_s, [P32, STR(cons_s, [P33, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [P41, STR(cons_s, [P42, CON_nil_s])]), STR(cons_s, [STR(cons_s, [P51, CON_nil_s]), CON_nil_s])])])])])) (fn () =>
263unify (T_2, STR(cons_s, [STR(cons_s, [P51, STR(cons_s, [P41, STR(cons_s, [P31, STR(cons_s, [P21, STR(cons_s, [P11, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [P42, STR(cons_s, [P32, STR(cons_s, [P22, STR(cons_s, [P12, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [P33, STR(cons_s, [P23, STR(cons_s, [P13, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [P24, STR(cons_s, [P14, CON_nil_s])]), STR(cons_s, [STR(cons_s, [P15, CON_nil_s]), CON_nil_s])])])])])) (fn () =>
264sc ())))))))))))))))))
265(* | rotate _ _ = () *)
266
267and move (T_1, T_2) sc =
268(
269trail (fn () =>
270(
271trail (fn () =>
272exists (fn X =>
273exists (fn Y =>
274unify (T_1, X) (fn () =>
275unify (T_2, Y) (fn () =>
276move_horiz (X, Y) sc)))))
277;
278exists (fn X =>
279exists (fn X1 =>
280exists (fn Y =>
281exists (fn Y1 =>
282unify (T_1, X) (fn () =>
283unify (T_2, Y) (fn () =>
284rotate (X, X1) (fn () =>
285move_horiz (X1, Y1) (fn () =>
286rotate (Y, Y1) sc))))))))
287))
288;
289exists (fn X =>
290exists (fn X1 =>
291exists (fn Y =>
292exists (fn Y1 =>
293unify (T_1, X) (fn () =>
294unify (T_2, Y) (fn () =>
295rotate (X1, X) (fn () =>
296move_horiz (X1, Y1) (fn () =>
297rotate (Y1, Y) sc))))))))
298)
299(* | move _ _ = () *)
300
301and solitaire (T_1, T_2, T_3) sc =
302(
303trail (fn () =>
304exists (fn X =>
305unify (T_1, X) (fn () =>
306unify (T_2, STR(cons_s, [X, CON_nil_s])) (fn () =>
307unify (T_3, INT(0)) (fn () =>
308sc ())))))
309;
310exists (fn N =>
311exists (fn X =>
312exists (fn Y =>
313exists (fn Z =>
314unify (T_1, X) (fn () =>
315unify (T_2, STR(cons_s, [X, Z])) (fn () =>
316unify (T_3, STR(s_s, [N])) (fn () =>
317move (X, Y) (fn () =>
318solitaire (Y, Z, N) sc))))))))
319)
320(* | solitaire _ _ = () *)
321
322and solution1 (T_1) sc =
323exists (fn X =>
324unify (T_1, X) (fn () =>
325solitaire (STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s,
326 CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])]), STR(cons_s, [STR(cons_s, [CON_x_s, CON_nil_s]), CON_nil_s])])])])])
327, X, STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [INT(0)])])])])])])])])])])])])])) sc))
328(* | solution1 _ _ = () *)
329
330and solution2 (T_1) sc =
331exists (fn X =>
332unify (T_1, X) (fn () =>
333solitaire (STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s,
334 CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])]), STR(cons_s, [STR(cons_s, [CON_x_s, CON_nil_s]), CON_nil_s])])])])])
335, X, STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [INT(0)])])])])])])])])])])])])])) sc))
336(* | solution2 _ _ = () *)
337 end (* local *)
338end; (* Data *)
339signature BMARK =
340 sig
341 val doit : int -> unit
342 val testit : TextIO.outstream -> unit
343 end;
344(* main.sml *)
345
346structure Main : BMARK =
347 struct
348 val name = "Logic"
349
350 exception Done
351
352 fun testit strm = Data.exists(fn Z => Data.solution2 Z (fn () => raise Done))
353 handle Done => TextIO.output(strm, "yes\n")
354
355 fun doit () = Data.exists(fn Z => Data.solution2 Z (fn () => raise Done))
356 handle Done => ()
357
358 val doit =
359 fn size =>
360 let
361 fun loop n =
362 if n = 0
363 then ()
364 else (doit();
365 loop(n-1))
366 in loop size
367 end
368
369 end; (* Main *)