@@ -659,10 +659,48 @@ theorem interpret_bvnego {εs : SymEntities} {I : Interpretation} {t : Term} {n
659659 (Factory.bvnego t).interpret I = Factory.bvnego (t.interpret I)
660660:= by show_interpret_unary_op Factory.bvnego wfl_of_type_bitvec_is_bitvec interpret_term_app_bvnego
661661
662+ theorem interpret_bvneg_inv {εs : SymEntities} {I : Interpretation} {t : Term} {n : Nat} :
663+ I.WellFormed εs → t.WellFormed εs → t.typeOf = .bitvec n →
664+ bvneg (Term.interpret I t) = Term.prim (TermPrim.bitvec bv) →
665+ Term.interpret I t = Term.prim (TermPrim.bitvec (-bv))
666+ := by
667+ intro h₁ h₂ h₃ h₄
668+ simp only [bvneg] at h₄
669+ split at h₄
670+ · rename_i h₅
671+ simp only [Term.prim.injEq, TermPrim.bitvec.injEq, h₅] at h₄ ⊢
672+ replace ⟨h₄, h₆⟩ := h₄
673+ subst h₄
674+ simp [←eq_of_heq h₆]
675+ · rename_i h₅
676+ have ⟨_, h₆⟩ : ∃ (bv : BitVec n), Term.interpret I t = Term.prim (TermPrim.bitvec bv) := by
677+ have ⟨hwf₁, hwf₂⟩ := interpret_term_wfl h₁ h₂
678+ simp only [h₃] at hwf₂
679+ simp [wfl_of_type_bitvec_is_bitvec hwf₁ hwf₂]
680+ simp [h₆] at h₅
681+ · contradiction
682+
662683theorem interpret_bvneg {εs : SymEntities} {I : Interpretation} {t : Term} {n : Nat} :
663684 I.WellFormed εs → t.WellFormed εs → t.typeOf = .bitvec n →
664685 (Factory.bvneg t).interpret I = Factory.bvneg (t.interpret I)
665- := by show_interpret_unary_op Factory.bvneg wfl_of_type_bitvec_is_bitvec interpret_term_app_bvneg
686+ := by
687+ intro h₁ h₂ h₃
688+ conv => lhs; unfold Factory.bvneg
689+ split
690+ · simp only [Factory.bvneg, interpret_term_prim]
691+ · rename_i t' _
692+ have ⟨hwf₁, hwf₂⟩ := interpret_term_wfl h₁ h₂
693+ cases h₂; rename_i hwf hwt
694+ cases hwt; rename_i ht'
695+ replace hwf : Term.WellFormed εs t' := by
696+ simpa using hwf
697+ rw [interpret_term_app_bvneg] at ⊢ hwf₁ hwf₂
698+ simp only [Term.typeOf] at hwf₂
699+ have ⟨bv, h⟩ := wfl_of_type_bitvec_is_bitvec hwf₁ hwf₂
700+ rw [h]
701+ simp only [bvneg, BitVec.neg_eq]
702+ exact interpret_bvneg_inv h₁ hwf ht' h
703+ · exact interpret_term_app_bvneg
666704
667705local macro "show_interpret_bvop" op_fun:ident pe_fun:ident interpret_op_thm:ident : tactic => do
668706 `(tactic| (
0 commit comments