|  |  |  | @ -9,32 +9,32 @@ let%test_module _ = | 
			
		
	
		
			
				
					|  |  |  |  |   ( module struct | 
			
		
	
		
			
				
					|  |  |  |  |     (* let () = Trace.init ~margin:68 ~config:all () *) | 
			
		
	
		
			
				
					|  |  |  |  |     let () = Trace.init ~margin:68 ~config:none () | 
			
		
	
		
			
				
					|  |  |  |  |     let pp = Format.printf "@\n%a@." Term.pp | 
			
		
	
		
			
				
					|  |  |  |  |     let ( ! ) i = Term.integer (Z.of_int i) | 
			
		
	
		
			
				
					|  |  |  |  |     let ( + ) = Term.add | 
			
		
	
		
			
				
					|  |  |  |  |     let ( - ) = Term.sub | 
			
		
	
		
			
				
					|  |  |  |  |     let ( * ) = Term.mul | 
			
		
	
		
			
				
					|  |  |  |  |     let ( = ) = Term.eq | 
			
		
	
		
			
				
					|  |  |  |  |     let ( != ) = Term.dq | 
			
		
	
		
			
				
					|  |  |  |  |     let ( < ) = Term.lt | 
			
		
	
		
			
				
					|  |  |  |  |     let ( <= ) = Term.le | 
			
		
	
		
			
				
					|  |  |  |  |     let ( && ) = Term.and_ | 
			
		
	
		
			
				
					|  |  |  |  |     let ( || ) = Term.or_ | 
			
		
	
		
			
				
					|  |  |  |  |     let ( ~~ ) = Term.not_ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     open Term | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let pp = Format.printf "@\n%a@." pp | 
			
		
	
		
			
				
					|  |  |  |  |     let ( ! ) i = integer (Z.of_int i) | 
			
		
	
		
			
				
					|  |  |  |  |     let ( + ) = add | 
			
		
	
		
			
				
					|  |  |  |  |     let ( - ) = sub | 
			
		
	
		
			
				
					|  |  |  |  |     let ( * ) = mul | 
			
		
	
		
			
				
					|  |  |  |  |     let ( = ) = eq | 
			
		
	
		
			
				
					|  |  |  |  |     let ( != ) = dq | 
			
		
	
		
			
				
					|  |  |  |  |     let ( < ) = lt | 
			
		
	
		
			
				
					|  |  |  |  |     let ( <= ) = le | 
			
		
	
		
			
				
					|  |  |  |  |     let ( && ) = and_ | 
			
		
	
		
			
				
					|  |  |  |  |     let ( || ) = or_ | 
			
		
	
		
			
				
					|  |  |  |  |     let ( ~~ ) = not_ | 
			
		
	
		
			
				
					|  |  |  |  |     let wrt = Var.Set.empty | 
			
		
	
		
			
				
					|  |  |  |  |     let y_, wrt = Var.fresh "y" ~wrt | 
			
		
	
		
			
				
					|  |  |  |  |     let z_, _ = Var.fresh "z" ~wrt | 
			
		
	
		
			
				
					|  |  |  |  |     let y = Term.var y_ | 
			
		
	
		
			
				
					|  |  |  |  |     let z = Term.var z_ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%test "booleans distinct" = | 
			
		
	
		
			
				
					|  |  |  |  |       Term.is_false (Term.eq Term.minus_one Term.zero) | 
			
		
	
		
			
				
					|  |  |  |  |     let y = var y_ | 
			
		
	
		
			
				
					|  |  |  |  |     let z = var z_ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%test "unsigned booleans distinct" = | 
			
		
	
		
			
				
					|  |  |  |  |       Term.is_false (Term.eq Term.one Term.zero) | 
			
		
	
		
			
				
					|  |  |  |  |     let%test "booleans distinct" = is_false (eq minus_one zero) | 
			
		
	
		
			
				
					|  |  |  |  |     let%test "unsigned booleans distinct" = is_false (eq one zero) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%test "boolean overflow" = | 
			
		
	
		
			
				
					|  |  |  |  |       Term.is_true | 
			
		
	
		
			
				
					|  |  |  |  |       is_true | 
			
		
	
		
			
				
					|  |  |  |  |         (Exp.eq | 
			
		
	
		
			
				
					|  |  |  |  |            (Exp.integer Typ.bool Z.minus_one) | 
			
		
	
		
			
				
					|  |  |  |  |            (Exp.convert ~dst:Typ.bool ~src:Typ.siz | 
			
		
	
	
		
			
				
					|  |  |  | @ -70,7 +70,7 @@ let%test_module _ = | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| -1 |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%test "unsigned boolean overflow" = | 
			
		
	
		
			
				
					|  |  |  |  |       Term.is_true | 
			
		
	
		
			
				
					|  |  |  |  |       is_true | 
			
		
	
		
			
				
					|  |  |  |  |         (Exp.uge | 
			
		
	
		
			
				
					|  |  |  |  |            (Exp.integer Typ.bool Z.minus_one) | 
			
		
	
		
			
				
					|  |  |  |  |            (Exp.convert ~dst:Typ.bool ~src:Typ.siz | 
			
		
	
	
		
			
				
					|  |  |  | @ -201,19 +201,19 @@ let%test_module _ = | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| 0 |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
		
			
				
					|  |  |  |  |       pp (!3 * y = z = Term.true_) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (!3 * y = z = true_) ; | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| ((3 × %y_1) = %z_2) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
		
			
				
					|  |  |  |  |       pp (Term.true_ = (!3 * y = z)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (true_ = (!3 * y = z)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| ((3 × %y_1) = %z_2) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
		
			
				
					|  |  |  |  |       pp (!3 * y = z = Term.false_) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (!3 * y = z = false_) ; | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| ((3 × %y_1) ≠ %z_2) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
		
			
				
					|  |  |  |  |       pp (Term.false_ = (!3 * y = z)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (false_ = (!3 * y = z)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| ((3 × %y_1) ≠ %z_2) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
	
		
			
				
					|  |  |  | @ -233,11 +233,11 @@ let%test_module _ = | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| ((-3 × %y_1 + 4) = %y_1) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
		
			
				
					|  |  |  |  |       pp (Term.sub Term.true_ (z = !4)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (sub true_ (z = !4)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| (-1 × (%z_2 = 4) + -1) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
		
			
				
					|  |  |  |  |       pp (Term.add Term.true_ (z = !4) = (z = !4)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (add true_ (z = !4) = (z = !4)) ; | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| (((%z_2 = 4) + -1) = (%z_2 = 4)) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
	
		
			
				
					|  |  |  | @ -269,9 +269,9 @@ let%test_module _ = | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect {| ((%y_1 < 2) && (3 ≤ %z_2)) |}] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let%expect_test _ = | 
			
		
	
		
			
				
					|  |  |  |  |       pp Term.(eq z null) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp Term.(eq null z) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp Term.(dq (eq null z) false_) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (eq z null) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (eq null z) ; | 
			
		
	
		
			
				
					|  |  |  |  |       pp (dq (eq null z) false_) ; | 
			
		
	
		
			
				
					|  |  |  |  |       [%expect | 
			
		
	
		
			
				
					|  |  |  |  |         {| | 
			
		
	
		
			
				
					|  |  |  |  |         (%z_2 = 0) | 
			
		
	
	
		
			
				
					|  |  |  | 
 |