fact: Definition check_flatten_body frec (l lf:_lit) := let l := remove_not l in let lf := remove_not lf in if l =? lf then true else if 1 land (l lxor lf) =? 0 then match get_form (Lit.blit l), get_form (Lit.blit lf) with | Fatom a1, Fatom a2 => check_atom a1 a2 | Ftrue, Ftrue => true | Ffalse, Ffalse => true | Fand args1, Fand args2 => let args1 := flatten_and args1 in let args2 := flatten_and args2 in forallb2 frec args1 args2 | For args1, For args2 => let args1 := flatten_or args1 in let args2 := flatten_or args2 in forallb2 frec args1 args2 | Fxor l1 l2, Fxor lf1 lf2 => frec l1 lf1 && frec l2 lf2 | Fimp args1, Fimp args2 => if PArray.length args1 =? PArray.length args2 then aforallbi (fun i l => frec l (args2.[i])) args1 else false | Fiff l1 l2, Fiff lf1 lf2 => frec l1 lf1 && frec l2 lf2 | Fite l1 l2 l3, Fite lf1 lf2 lf3 => frec l1 lf1 && frec l2 lf2 && frec l3 lf3 | _, _ => false end else match get_form (Lit.blit l), get_form (Lit.blit lf) with | Fatom a1, Fatom a2 => check_neg_atom a1 a2 | _, _ => false end.
imports: List PArray Bool Int63 ZMicromega ZArith Misc State SMT_terms BVList