|
|
@ -185,6 +185,16 @@ end = struct
|
|
|
|
elts )
|
|
|
|
elts )
|
|
|
|
elts]
|
|
|
|
elts]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let invariant e =
|
|
|
|
|
|
|
|
let@ () = Invariant.invariant [%here] e [%sexp_of: trm] in
|
|
|
|
|
|
|
|
match e with
|
|
|
|
|
|
|
|
| Q q -> assert (not (Z.equal Z.one (Q.den q)))
|
|
|
|
|
|
|
|
| Arith a -> (
|
|
|
|
|
|
|
|
match Arith.classify a with
|
|
|
|
|
|
|
|
| Compound -> ()
|
|
|
|
|
|
|
|
| Trm _ | Const _ -> assert false )
|
|
|
|
|
|
|
|
| _ -> ()
|
|
|
|
|
|
|
|
|
|
|
|
(* destructors *)
|
|
|
|
(* destructors *)
|
|
|
|
|
|
|
|
|
|
|
|
let get_z = function Z z -> Some z | _ -> None
|
|
|
|
let get_z = function Z z -> Some z | _ -> None
|
|
|
@ -192,38 +202,43 @@ end = struct
|
|
|
|
|
|
|
|
|
|
|
|
(* constructors *)
|
|
|
|
(* constructors *)
|
|
|
|
|
|
|
|
|
|
|
|
let _Var id name = Var {id; name}
|
|
|
|
let _Var id name = Var {id; name} |> check invariant
|
|
|
|
|
|
|
|
|
|
|
|
(* statically allocated since they are tested with == *)
|
|
|
|
(* statically allocated since they are tested with == *)
|
|
|
|
let zero = Z Z.zero
|
|
|
|
let zero = Z Z.zero |> check invariant
|
|
|
|
let one = Z Z.one
|
|
|
|
let one = Z Z.one |> check invariant
|
|
|
|
|
|
|
|
|
|
|
|
let _Z z =
|
|
|
|
let _Z z =
|
|
|
|
if Z.equal Z.zero z then zero else if Z.equal Z.one z then one else Z z
|
|
|
|
(if Z.equal Z.zero z then zero else if Z.equal Z.one z then one else Z z)
|
|
|
|
|
|
|
|
|> check invariant
|
|
|
|
|
|
|
|
|
|
|
|
let _Q q = if Z.equal Z.one (Q.den q) then _Z (Q.num q) else Q q
|
|
|
|
let _Q q =
|
|
|
|
|
|
|
|
(if Z.equal Z.one (Q.den q) then _Z (Q.num q) else Q q)
|
|
|
|
|
|
|
|
|> check invariant
|
|
|
|
|
|
|
|
|
|
|
|
let _Arith a =
|
|
|
|
let _Arith a =
|
|
|
|
match Arith.classify a with
|
|
|
|
( match Arith.classify a with
|
|
|
|
| Trm e -> e
|
|
|
|
| Trm e -> e
|
|
|
|
| Const q -> _Q q
|
|
|
|
| Const q -> _Q q
|
|
|
|
| Compound -> Arith a
|
|
|
|
| Compound -> Arith a )
|
|
|
|
|
|
|
|
|> check invariant
|
|
|
|
let _Splat x = Splat x
|
|
|
|
|
|
|
|
let _Sized seq siz = Sized {seq; siz}
|
|
|
|
let _Splat x = Splat x |> check invariant
|
|
|
|
let _Extract seq off len = Extract {seq; off; len}
|
|
|
|
let _Sized seq siz = Sized {seq; siz} |> check invariant
|
|
|
|
let _Concat es = Concat es
|
|
|
|
let _Extract seq off len = Extract {seq; off; len} |> check invariant
|
|
|
|
let _Select idx rcd = Select {idx; rcd}
|
|
|
|
let _Concat es = Concat es |> check invariant
|
|
|
|
let _Update idx rcd elt = Update {idx; rcd; elt}
|
|
|
|
let _Select idx rcd = Select {idx; rcd} |> check invariant
|
|
|
|
let _Record es = Record es
|
|
|
|
let _Update idx rcd elt = Update {idx; rcd; elt} |> check invariant
|
|
|
|
let _Ancestor i = Ancestor i
|
|
|
|
let _Record es = Record es |> check invariant
|
|
|
|
|
|
|
|
let _Ancestor i = Ancestor i |> check invariant
|
|
|
|
|
|
|
|
|
|
|
|
let _Apply f es =
|
|
|
|
let _Apply f es =
|
|
|
|
match
|
|
|
|
( match
|
|
|
|
Funsym.eval ~equal:equal_trm ~get_z ~ret_z:_Z ~get_q ~ret_q:_Q f es
|
|
|
|
Funsym.eval ~equal:equal_trm ~get_z ~ret_z:_Z ~get_q ~ret_q:_Q f es
|
|
|
|
with
|
|
|
|
with
|
|
|
|
| Some c -> c
|
|
|
|
| Some c -> c
|
|
|
|
| None -> Apply (f, es)
|
|
|
|
| None -> Apply (f, es) )
|
|
|
|
|
|
|
|
|> check invariant
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
open Trm
|
|
|
|
open Trm
|
|
|
@ -323,7 +338,6 @@ end = struct
|
|
|
|
match (d, e) with
|
|
|
|
match (d, e) with
|
|
|
|
| Z y, Z z -> if Z.equal y z then SemEq else SemDq
|
|
|
|
| Z y, Z z -> if Z.equal y z then SemEq else SemDq
|
|
|
|
| Q q, Q r -> if Q.equal q r then SemEq else SemDq
|
|
|
|
| Q q, Q r -> if Q.equal q r then SemEq else SemDq
|
|
|
|
| Z z, Q q | Q q, Z z -> if Q.equal (Q.of_z z) q then SemEq else SemDq
|
|
|
|
|
|
|
|
| _ ->
|
|
|
|
| _ ->
|
|
|
|
let ord = compare_trm d e in
|
|
|
|
let ord = compare_trm d e in
|
|
|
|
if ord < 0 then SynLt else if ord = 0 then SemEq else SynGt
|
|
|
|
if ord < 0 then SynLt else if ord = 0 then SemEq else SynGt
|
|
|
@ -936,7 +950,6 @@ module Term = struct
|
|
|
|
let const_of = function
|
|
|
|
let const_of = function
|
|
|
|
| `Trm (Z z) -> Some (Q.of_z z)
|
|
|
|
| `Trm (Z z) -> Some (Q.of_z z)
|
|
|
|
| `Trm (Q q) -> Some q
|
|
|
|
| `Trm (Q q) -> Some q
|
|
|
|
| `Trm (Arith a) -> Arith.get_const a
|
|
|
|
|
|
|
|
| _ -> None
|
|
|
|
| _ -> None
|
|
|
|
|
|
|
|
|
|
|
|
(** Traverse *)
|
|
|
|
(** Traverse *)
|
|
|
|