diff --git a/sledge/src/fol.ml b/sledge/src/fol.ml index 17a1d0a5b..1be9c70af 100644 --- a/sledge/src/fol.ml +++ b/sledge/src/fol.ml @@ -267,7 +267,6 @@ module Fml : sig | And of fml * fml | Or of fml * fml | Iff of fml * fml - | Xor of fml * fml | Cond of {cnd: fml; pos: fml; neg: fml} (* uninterpreted literals *) | Lit of Predsym.t * trm array @@ -281,7 +280,6 @@ module Fml : sig val _And : fml -> fml -> fml val _Or : fml -> fml -> fml val _Iff : fml -> fml -> fml - val _Xor : fml -> fml -> fml val _Cond : fml -> fml -> fml -> fml val _Lit : Predsym.t -> trm array -> fml end = struct @@ -294,7 +292,6 @@ end = struct | And of fml * fml | Or of fml * fml | Iff of fml * fml - | Xor of fml * fml | Cond of {cnd: fml; pos: fml; neg: fml} | Lit of Predsym.t * trm array [@@deriving compare, equal, sexp] @@ -349,7 +346,7 @@ end = struct let _Lit p xs = Lit (p, xs) let rec is_negative = function - | Not (Tt | Eq _ | Eq0 _ | Gt0 _ | Lit _) | Or _ | Xor _ -> true + | Not (Tt | Eq _ | Eq0 _ | Gt0 _ | Lit _ | Iff _) | Or _ -> true | Tt | Eq _ | Eq0 _ | Gt0 _ | And _ | Iff _ | Lit _ | Cond _ -> false | Not p -> not (is_negative p) @@ -365,8 +362,6 @@ end = struct | Opposite -> Opposite | _ -> Unknown ) | _ -> Unknown ) - | Iff (p, q), Xor (p', q') | Xor (p, q), Iff (p', q') -> - if equal_fml p p' && equal_fml q q' then Opposite else Unknown | Cond {cnd= c; pos= p; neg= n}, Cond {cnd= c'; pos= p'; neg= n'} -> if equal_fml c c' then match equal_or_opposite p p' with @@ -415,26 +410,12 @@ end = struct let p, q = sort_fml p q in Iff (p, q) ) - and _Xor p q = - match (p, q) with - | Tt, p | p, Tt -> _Not p - | Not Tt, p | p, Not Tt -> p - | _ -> ( - match equal_or_opposite p q with - | Equal -> _Ff - | Opposite -> Tt - | Unknown -> - let p, q = sort_fml p q in - Xor (p, q) ) - and _Not = function | Not x -> x | And (x, y) -> _Or (_Not x) (_Not y) | Or (x, y) -> _And (_Not x) (_Not y) - | Iff (x, y) -> _Xor x y - | Xor (x, y) -> _Iff x y | Cond {cnd; pos; neg} -> _Cond cnd (_Not pos) (_Not neg) - | (Tt | Eq _ | Eq0 _ | Gt0 _ | Lit _) as x -> Not x + | (Tt | Eq _ | Eq0 _ | Gt0 _ | Lit _ | Iff _) as x -> Not x and _Cond cnd pos neg = match (cnd, pos, neg) with @@ -510,7 +491,6 @@ let ppx_f strength fs fml = | And (x, y) -> pf "(%a@ @<2>∧ %a)" pp x pp y | Or (x, y) -> pf "(%a@ @<2>∨ %a)" pp x pp y | Iff (x, y) -> pf "(%a@ <=> %a)" pp x pp y - | Xor (x, y) -> pf "(%a@ xor %a)" pp x pp y | Cond {cnd; pos; neg} -> pf "@[(%a@ ? %a@ : %a)@]" pp cnd pp pos pp neg | Lit (p, xs) -> pf "%a(%a)" Predsym.pp p (Array.pp ",@ " pp_t) xs @@ -561,7 +541,7 @@ let rec fold_vars_f ~init p ~f = | Eq (x, y) -> fold_vars_t ~f x ~init:(fold_vars_t ~f y ~init) | Eq0 x | Gt0 x -> fold_vars_t ~f x ~init | Not x -> fold_vars_f ~f x ~init - | And (x, y) | Or (x, y) | Iff (x, y) | Xor (x, y) -> + | And (x, y) | Or (x, y) | Iff (x, y) -> fold_vars_f ~f x ~init:(fold_vars_f ~f y ~init) | Cond {cnd; pos; neg} -> fold_vars_f ~f cnd @@ -612,7 +592,6 @@ let rec map_trms_f ~f b = | And (x, y) -> map2 (map_trms_f ~f) b _And x y | Or (x, y) -> map2 (map_trms_f ~f) b _Or x y | Iff (x, y) -> map2 (map_trms_f ~f) b _Iff x y - | Xor (x, y) -> map2 (map_trms_f ~f) b _Xor x y | Cond {cnd; pos; neg} -> map3 (map_trms_f ~f) b _Cond cnd pos neg | Lit (p, xs) -> mapN f b (_Lit p) xs @@ -944,7 +923,7 @@ module Formula = struct let or_ = _Or let orN = function [] -> ff | b :: bs -> List.fold ~init:b ~f:or_ bs let iff = _Iff - let xor = _Xor + let xor p q = _Not (_Iff p q) let cond ~cnd ~pos ~neg = _Cond cnd pos neg let not_ = _Not @@ -982,7 +961,6 @@ module Formula = struct | And (x, y) -> map2 (map_terms ~f) b _And x y | Or (x, y) -> map2 (map_terms ~f) b _Or x y | Iff (x, y) -> map2 (map_terms ~f) b _Iff x y - | Xor (x, y) -> map2 (map_terms ~f) b _Xor x y | Cond {cnd; pos; neg} -> map3 (map_terms ~f) b _Cond cnd pos neg | Lit (p, xs) -> lift_mapN f b (_Lit p) xs @@ -1008,7 +986,7 @@ module Formula = struct fun ~meet1 ~join1 ~top ~bot fml -> let rec add_conjunct (cjn, splits) fml = match fml with - | Tt | Eq _ | Eq0 _ | Gt0 _ | Iff _ | Xor _ | Lit _ | Not _ -> + | Tt | Eq _ | Eq0 _ | Gt0 _ | Iff _ | Lit _ | Not _ -> (meet1 fml cjn, splits) | And (p, q) -> add_conjunct (add_conjunct (cjn, splits) p) q | Or (p, q) -> (cjn, [p; q] :: splits) @@ -1088,7 +1066,6 @@ let rec f_to_ses : fml -> Ses.Term.t = function | And (p, q) -> Ses.Term.and_ (f_to_ses p) (f_to_ses q) | Or (p, q) -> Ses.Term.or_ (f_to_ses p) (f_to_ses q) | Iff (p, q) -> Ses.Term.eq (f_to_ses p) (f_to_ses q) - | Xor (p, q) -> Ses.Term.dq (f_to_ses p) (f_to_ses q) | Cond {cnd; pos; neg} -> Ses.Term.conditional ~cnd:(f_to_ses cnd) ~thn:(f_to_ses pos) ~els:(f_to_ses neg)