You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
4.8 KiB

(*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
let%test_module _ =
( module struct
open Sh
(* let () =
* Trace.init ~margin:160 ~config:(Result.ok_exn (Trace.parse "+Sh")) () *)
let () = Trace.init ~margin:68 ~config:Trace.none ()
let pp = Format.printf "@\n%a@." pp
let pp_raw = Format.printf "@\n%a@." pp_raw
let pp_djn = Format.printf "@\n%a@." pp_djn
let ( ~$ ) = Var.Set.of_list
let ( ! ) i = Term.integer (Z.of_int i)
let ( - ) = Term.sub
let ( = ) = Term.eq
let f = Term.unsigned 8
let wrt = Var.Set.empty
let a_, wrt = Var.fresh "a" ~wrt
let b_, wrt = Var.fresh "b" ~wrt
let c_, wrt = Var.fresh "c" ~wrt
let d_, wrt = Var.fresh "d" ~wrt
let e_, wrt = Var.fresh "e" ~wrt
let x_, wrt = Var.fresh "x" ~wrt
let y_, wrt = Var.fresh "y" ~wrt
let _ = wrt
let a = Term.var a_
let b = Term.var b_
let c = Term.var c_
let d = Term.var d_
let e = Term.var e_
let x = Term.var x_
let y = Term.var y_
let%expect_test _ =
let p = exists ~$[x_] (extend_us ~$[x_] emp) in
let q = pure (x = !0) in
pp p ;
pp q ;
pp (star p q) ;
[%expect
{|
%x_6 . emp
0 = %x_6 emp
0 = %x_6 emp |}]
let%expect_test _ =
let q =
or_
(pure (x = !0))
(exists
~$[x_]
(or_
(and_ (x = !1) (pure (y = !1)))
(exists ~$[x_] (pure (x = !2)))))
in
pp q ;
pp_djn (dnf q) ;
[%expect
{|
( ( 0 = %x_6 emp)
( ( ( 1 = _ = %y_7 emp) ( 2 = _ emp) ))
)
( ( %x_6, %x_7 . 2 = %x_7 (%x_7 = 2) emp)
( %x_6 . 1 = %x_6 = %y_7 (%x_6 = 1) (%y_7 = 1) emp)
( 0 = %x_6 (%x_6 = 0) emp)
) |}]
let%expect_test _ =
let q =
exists
~$[x_]
(or_
(pure (x = !0))
(exists
~$[x_]
(or_
(and_ (x = !1) (pure (y = !1)))
(exists ~$[x_] (pure (x = !2))))))
in
pp q ;
pp_djn (dnf q) ;
[%expect
{|
( ( 0 = _ emp)
( ( ( 1 = _ = %y_7 emp) ( 2 = _ emp) ))
)
( ( %x_6, %x_8, %x_9 . 2 = %x_9 (%x_9 = 2) emp)
( %x_6, %x_8 . 1 = %y_7 = %x_8 (%y_7 = 1) (%x_8 = 1) emp)
( %x_6 . 0 = %x_6 (%x_6 = 0) emp)
) |}]
let%expect_test _ =
let q =
exists
~$[x_]
(or_
(pure (x = !0))
(exists
~$[x_]
(or_
(and_ (x = !1) (pure (y = !1)))
(exists ~$[x_] (pure (x = !2))))))
in
pp q ;
pp (simplify q) ;
[%expect
{|
( ( 0 = _ emp)
( ( ( 1 = _ = %y_7 emp) ( 2 = _ emp) ))
)
( ( 1 = %y_7 emp) ( emp) ( emp) ) |}]
let of_eqs l =
List.fold ~init:emp ~f:(fun q (a, b) -> and_ (Term.eq a b) q) l
let%expect_test _ =
let q = exists ~$[x_] (of_eqs [(f x, x); (f y, y - !1)]) in
pp q ;
let q' = simplify q in
pp_raw q' ;
pp q' ;
[%expect
{|
%x_6 .
(((u8) %y_7) + 1) = %y_7
%x_6 = ((u8) %x_6)
((u8) %y_7) = ((u8) (((u8) %y_7) + 1))
emp
(((u8) %y_7) + 1) = %y_7
((u8) %y_7) = ((u8) (((u8) %y_7) + 1))
((%y_7 + -1) = ((u8) %y_7))
emp
(((u8) %y_7) + 1) = %y_7
((u8) %y_7) = ((u8) (((u8) %y_7) + 1))
emp |}]
let%expect_test _ =
let q =
exists
~$[a_; c_; d_; e_]
(star
(pure (Term.eq_concat (!16, e) [|(!8, a); (!8, d)|]))
(or_
(pure (Term.dq x !0))
(exists
(Var.Set.of_list [b_])
(pure (Term.eq_concat (!8, a) [|(!4, c); (!4, b)|])))))
in
pp_raw q ;
let q' = simplify q in
pp_raw q' ;
pp q' ;
[%expect
{|
%a_1, %c_3, %d_4, %e_5 .
(8,%a_1^8,%d_4) = %e_5
(16,%e_5 = (8,%a_1^8,%d_4))
emp
* ( ( (%x_6 0) emp)
( %b_2 .
(4,%c_3^4,%b_2) = %a_1
(8,%a_1 = (4,%c_3^4,%b_2))
emp)
)
( ( emp) ( (%x_6 0) emp) )
( ( emp) ( (%x_6 0) emp) ) |}]
end )