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.
288 lines
12 KiB
288 lines
12 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.
|
|
*)
|
|
|
|
open Fol
|
|
|
|
let%test_module _ =
|
|
( module struct
|
|
open Context
|
|
|
|
let () = Trace.init ~margin:68 ()
|
|
|
|
(* let () =
|
|
* Trace.init ~margin:160
|
|
* ~config:
|
|
* (Result.get_ok
|
|
* (Trace.parse
|
|
* "+Context-Context.canon-Context.canon_f-Context.norm-Context.find_extend_"))
|
|
* () *)
|
|
|
|
[@@@warning "-32"]
|
|
|
|
let printf pp = Format.printf "@\n%a@." pp
|
|
let pp = printf Context.pp_raw
|
|
let pp_classes = Format.printf "@\n@[<hv> %a@]@." Context.pp
|
|
let ( ! ) i = Term.integer (Z.of_int i)
|
|
let g x y = Term.apply (Uninterp "g") [|x; y|]
|
|
let wrt = Var.Set.empty
|
|
let t_, wrt = Var.fresh "t" ~wrt
|
|
let u_, wrt = Var.fresh "u" ~wrt
|
|
let v_, wrt = Var.fresh "v" ~wrt
|
|
let w_, wrt = Var.fresh "w" ~wrt
|
|
let x_, wrt = Var.fresh "x" ~wrt
|
|
let y_, wrt = Var.fresh "y" ~wrt
|
|
let z_, wrt = Var.fresh "z" ~wrt
|
|
let t = Term.var t_
|
|
let u = Term.var u_
|
|
let v = Term.var v_
|
|
let w = Term.var w_
|
|
let x = Term.var x_
|
|
let y = Term.var y_
|
|
let z = Term.var z_
|
|
|
|
let of_eqs l =
|
|
List.fold
|
|
~f:(fun (a, b) (us, r) -> add us (Formula.eq a b) r)
|
|
l (wrt, empty)
|
|
|> snd
|
|
|
|
let implies_eq r a b = implies r (Formula.eq a b)
|
|
|
|
(* tests *)
|
|
|
|
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]
|
|
|
|
let%expect_test _ =
|
|
pp_classes r3 ;
|
|
pp r3 ;
|
|
[%expect
|
|
{|
|
|
%t_1 = %u_2 = %v_3 = %w_4 = %x_5 = %z_7 = g(%y_6, %t_1)
|
|
= g(%y_6, %u_2) = g(%y_6, %v_3) = g(%y_6, %z_7)
|
|
|
|
{ sat= true;
|
|
rep= [[%t_1 ↦ ];
|
|
[%u_2 ↦ %t_1];
|
|
[%v_3 ↦ %t_1];
|
|
[%w_4 ↦ %t_1];
|
|
[%x_5 ↦ %t_1];
|
|
[%y_6 ↦ ];
|
|
[%z_7 ↦ %t_1];
|
|
[g(%y_6, %t_1) ↦ %t_1];
|
|
[g(%y_6, %u_2) ↦ %t_1];
|
|
[g(%y_6, %v_3) ↦ %t_1];
|
|
[g(%y_6, %z_7) ↦ %t_1]];
|
|
cls= [[%t_1
|
|
↦ {%u_2, %v_3, %w_4, %x_5, %z_7, g(%y_6, %t_1),
|
|
g(%y_6, %u_2), g(%y_6, %v_3), g(%y_6, %z_7)}]];
|
|
use= [[%t_1 ↦ g(%y_6, %t_1)];
|
|
[%u_2 ↦ g(%y_6, %u_2)];
|
|
[%v_3 ↦ g(%y_6, %v_3)];
|
|
[%y_6 ↦ g(%y_6, %t_1), g(%y_6, %u_2), g(%y_6, %v_3),
|
|
g(%y_6, %z_7)];
|
|
[%z_7 ↦ g(%y_6, %z_7)]] } |}]
|
|
|
|
let%test _ = implies_eq r3 t z
|
|
|
|
let b = Formula.inject (Formula.dq x !0)
|
|
let r15 = of_eqs [(b, b); (x, !1)]
|
|
|
|
let%expect_test _ =
|
|
pp r15 ;
|
|
[%expect
|
|
{|
|
|
{ sat= true; rep= [[%x_5 ↦ 1]]; cls= [[1 ↦ {%x_5}]]; use= [] } |}]
|
|
|
|
let%test _ = implies_eq r15 (Term.neg b) (Term.apply (Signed 1) [|!1|])
|
|
let%test _ = implies_eq r15 (Term.apply (Unsigned 1) [|b|]) !1
|
|
|
|
let%expect_test _ =
|
|
replay
|
|
{|(Dnf
|
|
(Eq (Sized (seq (Var (id 1) (name a))) (siz (Z 8)))
|
|
(Concat
|
|
((Sized (seq (Var (id 3) (name c))) (siz (Z 4)))
|
|
(Sized (seq (Var (id 2) (name b))) (siz (Z 4)))))))|} ;
|
|
[%expect {| |}]
|
|
|
|
let%expect_test _ =
|
|
replay
|
|
{|(Union
|
|
((Var (id 1) (name a)) (Var (id 2) (name a)) (Var (id 3) (name a))
|
|
(Var (id 6) (name l)) (Var (id 7) (name a1)))
|
|
((xs ()) (sat true)
|
|
(rep
|
|
(((Var (id 7) (name a1)) (Var (id 2) (name a)))
|
|
((Var (id 2) (name a)) (Var (id 2) (name a)))))
|
|
(cls (((Var (id 2) (name a)) ((Var (id 7) (name a1)))))) (use ())
|
|
(pnd ()))
|
|
((xs ()) (sat true)
|
|
(rep
|
|
(((Var (id 7) (name a1)) (Var (id 7) (name a1)))
|
|
((Var (id 3) (name a))
|
|
(Concat
|
|
((Sized (seq (Var (id 1) (name a))) (siz (Z 8)))
|
|
(Sized (seq (Var (id 7) (name a1))) (siz (Z 8))))))
|
|
((Var (id 1) (name a)) (Var (id 1) (name a)))))
|
|
(cls
|
|
(((Concat
|
|
((Sized (seq (Var (id 1) (name a))) (siz (Z 8)))
|
|
(Sized (seq (Var (id 7) (name a1))) (siz (Z 8)))))
|
|
((Var (id 3) (name a))))))
|
|
(use
|
|
(((Var (id 7) (name a1))
|
|
((Concat
|
|
((Sized (seq (Var (id 1) (name a))) (siz (Z 8)))
|
|
(Sized (seq (Var (id 7) (name a1))) (siz (Z 8)))))))
|
|
((Var (id 1) (name a))
|
|
((Concat
|
|
((Sized (seq (Var (id 1) (name a))) (siz (Z 8)))
|
|
(Sized (seq (Var (id 7) (name a1))) (siz (Z 8)))))))))
|
|
(pnd ())))|} ;
|
|
[%expect {| |}]
|
|
|
|
let%expect_test _ =
|
|
replay
|
|
{|(Union
|
|
((Var (id 0) (name 1)) (Var (id 0) (name 4)) (Var (id 0) (name 6))
|
|
(Var (id 0) (name 8)) (Var (id 0) (name freturn))
|
|
(Var (id 1) (name freturn)))
|
|
((xs ()) (sat true)
|
|
(rep
|
|
(((Apply (Signed 8) ((Var (id 0) (name 8))))
|
|
(Var (id 0) (name freturn)))
|
|
((Var (id 0) (name freturn)) (Var (id 0) (name freturn)))
|
|
((Var (id 0) (name 8)) (Var (id 0) (name 8)))))
|
|
(cls
|
|
(((Var (id 0) (name freturn))
|
|
((Apply (Signed 8) ((Var (id 0) (name 8))))))))
|
|
(use
|
|
(((Var (id 0) (name 8)) ((Apply (Signed 8) ((Var (id 0) (name 8))))))))
|
|
(pnd ()))
|
|
((xs ()) (sat true)
|
|
(rep
|
|
(((Apply (Uninterp .str) ()) (Var (id 0) (name 6)))
|
|
((Var (id 0) (name 8)) (Z 73))
|
|
((Var (id 0) (name 6)) (Var (id 0) (name 6)))))
|
|
(cls
|
|
(((Z 73) ((Var (id 0) (name 8))))
|
|
((Var (id 0) (name 6)) ((Apply (Uninterp .str) ())))))
|
|
(use ()) (pnd ())))|} ;
|
|
[%expect {||}]
|
|
|
|
let%expect_test _ =
|
|
replay
|
|
{|(Apply_and_elim
|
|
((Var (id 0) (name 12)) (Var (id 0) (name 16)) (Var (id 0) (name 19))
|
|
(Var (id 0) (name 22)) (Var (id 0) (name 23)) (Var (id 0) (name 26))
|
|
(Var (id 0) (name 29)) (Var (id 0) (name 33)) (Var (id 0) (name 35))
|
|
(Var (id 0) (name 39)) (Var (id 0) (name 4)) (Var (id 0) (name 40))
|
|
(Var (id 0) (name 41)) (Var (id 0) (name 47)) (Var (id 0) (name 5))
|
|
(Var (id 0) (name 52)) (Var (id 0) (name 8)) (Var (id 1) (name m))
|
|
(Var (id 2) (name a)) (Var (id 6) (name b)))
|
|
((Var (id 1) (name m)) (Var (id 2) (name a)) (Var (id 6) (name b)))
|
|
(((Var (id 6) (name b)) (Var (id 2) (name a)))
|
|
((Var (id 1) (name m))
|
|
(Apply (Signed 32)
|
|
((Apply (Signed 32) ((Arith (((((Var (id 0) (name 23)) 1)) 4)))))))))
|
|
((xs ()) (sat true)
|
|
(rep
|
|
(((Apply (Signed 32)
|
|
((Apply (Signed 32) ((Arith (((((Var (id 0) (name 23)) 1)) 4)))))))
|
|
(Var (id 1) (name m)))
|
|
((Apply (Signed 32) ((Arith (((((Var (id 0) (name 23)) 1)) 4)))))
|
|
(Apply (Signed 32) ((Arith (((((Var (id 0) (name 23)) 1)) 4))))))
|
|
((Apply (Signed 32) ((Var (id 0) (name 5))))
|
|
(Arith ((() -1) ((((Var (id 0) (name 23)) 1)) 1))))
|
|
((Var (id 6) (name b)) (Var (id 2) (name a)))
|
|
((Var (id 2) (name a)) (Var (id 2) (name a)))
|
|
((Var (id 1) (name m)) (Var (id 1) (name m)))
|
|
((Var (id 0) (name 8))
|
|
(Arith ((() -1) ((((Var (id 0) (name 23)) 1)) 1))))
|
|
((Var (id 0) (name 52)) (Var (id 0) (name 26)))
|
|
((Var (id 0) (name 5)) (Var (id 0) (name 5)))
|
|
((Var (id 0) (name 35)) (Var (id 0) (name 23)))
|
|
((Var (id 0) (name 33)) (Z 0))
|
|
((Var (id 0) (name 26)) (Var (id 0) (name 26)))
|
|
((Var (id 0) (name 23)) (Var (id 0) (name 23)))
|
|
((Var (id 0) (name 22)) (Var (id 0) (name 22)))
|
|
((Var (id 0) (name 19))
|
|
(Arith ((() -1) ((((Var (id 0) (name 23)) 1)) 1))))
|
|
((Var (id 0) (name 16))
|
|
(Arith ((() -1) ((((Var (id 0) (name 23)) 1)) 1))))))
|
|
(cls
|
|
(((Arith ((() -1) ((((Var (id 0) (name 23)) 1)) 1)))
|
|
((Var (id 0) (name 16)) (Var (id 0) (name 8))
|
|
(Var (id 0) (name 19))
|
|
(Apply (Signed 32) ((Var (id 0) (name 5))))))
|
|
((Z 0) ((Var (id 0) (name 33))))
|
|
((Var (id 2) (name a)) ((Var (id 6) (name b))))
|
|
((Var (id 1) (name m))
|
|
((Apply (Signed 32)
|
|
((Apply (Signed 32)
|
|
((Arith (((((Var (id 0) (name 23)) 1)) 4)))))))))
|
|
((Var (id 0) (name 26)) ((Var (id 0) (name 52))))
|
|
((Var (id 0) (name 23)) ((Var (id 0) (name 35))))))
|
|
(use
|
|
(((Apply (Signed 32) ((Arith (((((Var (id 0) (name 23)) 1)) 4)))))
|
|
((Apply (Signed 32)
|
|
((Apply (Signed 32)
|
|
((Arith (((((Var (id 0) (name 23)) 1)) 4)))))))))
|
|
((Var (id 0) (name 5))
|
|
((Apply (Signed 32) ((Var (id 0) (name 5))))))
|
|
((Var (id 0) (name 23))
|
|
((Arith ((() -1) ((((Var (id 0) (name 23)) 1)) 1)))
|
|
(Apply (Signed 32)
|
|
((Arith (((((Var (id 0) (name 23)) 1)) 4)))))))))
|
|
(pnd ())))|} ;
|
|
[%expect {| |}]
|
|
|
|
let%expect_test _ =
|
|
replay
|
|
{|(Add () (Eq (Var (id 2) (name u)) (Var (id 5) (name x)))
|
|
((xs ()) (sat true)
|
|
(rep
|
|
(((Apply (Uninterp g) ((Var (id 6) (name y)) (Var (id 7) (name z))))
|
|
(Var (id 3) (name v)))
|
|
((Apply (Uninterp g) ((Var (id 6) (name y)) (Var (id 3) (name v))))
|
|
(Var (id 1) (name t)))
|
|
((Var (id 7) (name z)) (Var (id 7) (name z)))
|
|
((Var (id 6) (name y)) (Var (id 6) (name y)))
|
|
((Var (id 5) (name x)) (Var (id 3) (name v)))
|
|
((Var (id 4) (name w)) (Var (id 3) (name v)))
|
|
((Var (id 3) (name v)) (Var (id 3) (name v)))
|
|
((Var (id 1) (name t)) (Var (id 1) (name t)))))
|
|
(cls
|
|
(((Var (id 3) (name v))
|
|
((Var (id 5) (name x))
|
|
(Apply (Uninterp g)
|
|
((Var (id 6) (name y)) (Var (id 7) (name z))))
|
|
(Var (id 4) (name w))))
|
|
((Var (id 1) (name t))
|
|
((Apply (Uninterp g)
|
|
((Var (id 6) (name y)) (Var (id 3) (name v))))))))
|
|
(use
|
|
(((Var (id 7) (name z))
|
|
((Apply (Uninterp g)
|
|
((Var (id 6) (name y)) (Var (id 7) (name z))))))
|
|
((Var (id 6) (name y))
|
|
((Apply (Uninterp g)
|
|
((Var (id 6) (name y)) (Var (id 3) (name v))))
|
|
(Apply (Uninterp g)
|
|
((Var (id 6) (name y)) (Var (id 7) (name z))))))
|
|
((Var (id 3) (name v))
|
|
((Apply (Uninterp g)
|
|
((Var (id 6) (name y)) (Var (id 3) (name v))))))))
|
|
(pnd ())))|} ;
|
|
[%expect {| |}]
|
|
|
|
(* let%expect_test _ =
|
|
* replay
|
|
* {||} ;
|
|
* [%expect {| |}] *)
|
|
end )
|