1 (* From the SML
/NJ benchmark suite
. *)
8 = STR
of string * term list
11 | REF
of term option ref
13 exception BadArg
of string
22 val global_trail
= ref (nil
: term option ref list
)
23 val trail_counter
= ref
0
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"
31 fun reset_trail () = ( global_trail
:= nil
)
35 val tc0
= !trail_counter
39 unwind_trail (!trail_counter
-tc0
, !global_trail
) ;
40 trail_counter
:= tc0
)
45 global_trail
:= r
::(!global_trail
) ;
46 trail_counter
:= !trail_counter
+1 )
56 fun same_ref (r
, REF(r
')) = (r
= r
')
59 fun occurs_check r t
=
61 fun oc (STR(_
,ts
)) = ocs ts
69 |
ocs (t
::ts
) = oc t
andalso ocs ts
73 fun deref (t
as (REF(x
))) =
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
=
82 then unifys (ts
,ss
) sc
84 | unify
' (CON(f
), CON(g
)) sc
=
89 | unify
' (INT(f
), INT(g
)) sc
=
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
)
100 and unify_REF (r
, t
) sc
=
103 else if occurs_check r t
104 then ( bind(r
, t
) ; sc () )
108 fun unify (s
, t
) = unify
' (deref(s
), deref(t
))
117 open Term Trail Unify
123 val CON_o_s
= CON(o_s
)
124 val CON_nil_s
= CON(nil_s
)
125 val CON_x_s
= CON(x_s
)
127 fun exists sc
= sc (REF(ref(NONE
)))
129 fun move_horiz (T_1
, T_2
) sc
=
154 unify (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 () =>
155 unify (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 () =>
161 unify (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 () =>
162 unify (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 () =>
169 unify (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 () =>
170 unify (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 () =>
177 unify (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 () =>
178 unify (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 () =>
185 unify (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 () =>
186 unify (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 () =>
193 unify (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 () =>
194 unify (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 () =>
200 unify (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 () =>
201 unify (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 () =>
208 unify (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 () =>
209 unify (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 () =>
216 unify (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 () =>
217 unify (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 () =>
224 unify (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 () =>
225 unify (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 () =>
232 unify (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 () =>
233 unify (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 () =>
240 unify (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 () =>
241 unify (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 () =>
244 (* | move_horiz _ _
= () *)
246 and rotate (T_1
, T_2
) sc
=
262 unify (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 () =>
263 unify (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 () =>
264 sc ())))))))))))))))))
265 (* | rotate _ _
= () *)
267 and move (T_1
, T_2
) sc
=
274 unify (T_1
, X
) (fn () =>
275 unify (T_2
, Y
) (fn () =>
276 move_horiz (X
, Y
) sc
)))))
282 unify (T_1
, X
) (fn () =>
283 unify (T_2
, Y
) (fn () =>
284 rotate (X
, X1
) (fn () =>
285 move_horiz (X1
, Y1
) (fn () =>
286 rotate (Y
, Y1
) sc
))))))))
293 unify (T_1
, X
) (fn () =>
294 unify (T_2
, Y
) (fn () =>
295 rotate (X1
, X
) (fn () =>
296 move_horiz (X1
, Y1
) (fn () =>
297 rotate (Y1
, Y
) sc
))))))))
299 (* | move _ _
= () *)
301 and solitaire (T_1
, T_2
, T_3
) sc
=
305 unify (T_1
, X
) (fn () =>
306 unify (T_2
, STR(cons_s
, [X
, CON_nil_s
])) (fn () =>
307 unify (T_3
, INT(0)) (fn () =>
314 unify (T_1
, X
) (fn () =>
315 unify (T_2
, STR(cons_s
, [X
, Z
])) (fn () =>
316 unify (T_3
, STR(s_s
, [N
])) (fn () =>
317 move (X
, Y
) (fn () =>
318 solitaire (Y
, Z
, N
) sc
))))))))
320 (* | solitaire _ _
= () *)
322 and solution1 (T_1
) sc
=
324 unify (T_1
, X
) (fn () =>
325 solitaire (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 _ _
= () *)
330 and solution2 (T_1
) sc
=
332 unify (T_1
, X
) (fn () =>
333 solitaire (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 _ _
= () *)
341 val doit
: int -> unit
342 val testit
: TextIO.outstream
-> unit
346 structure Main
: BMARK
=
352 fun testit strm
= Data
.exists(fn Z
=> Data
.solution2
Z (fn () => raise Done
))
353 handle Done
=> TextIO.output(strm
, "yes\n")
355 fun doit () = Data
.exists(fn Z
=> Data
.solution2
Z (fn () => raise Done
))