Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Archive-of-Formal-Proofs/thys/Jinja/DFA/   (Sammlung formaler Beweise Version 2026-5©)  Datei vom 31.4.2026 mit Größe 6 kB image not shown  

Quelle  Product.thy

  Sprache: Isabelle
 

(*  Title:      HOL/MicroJava/BV/Product.thy
    Author:     Tobias Nipkow
    Copyright   2000 TUM

Products as semilattices.
*)


section Products as Semilattices

theory Product
imports Err
begin

definition le :: "'a ord ==> 'b ord ==> ('a × 'b) ord"
where
  "le rA rB = (λ(a1,b1) (a2,b2). a1 A a2 b1 B b2)"

definition sup :: "'a ebinop ==> 'b ebinop ==> ('a × 'b) ebinop"
where
  "sup f g = (λ(a1,b1)(a2,b2). Err.sup Pair (a1 f a2) (b1 g b2))"

definition esl :: "'a esl ==> 'b esl ==> ('a × 'b ) esl"
where
  "esl = (λ(A,rA,fA) (B,rB,fB). (A × B, le rA rB, sup fA fB))"

abbreviation
  lesubprod :: "'a × 'b ==> ('a ==> 'a ==> bool) ==> ('b ==> 'b ==> bool) ==> 'a × 'b ==> bool"
    ((_ /'(_,_') _) [50005150where
  "p (rA,rB) q == p .le rA rB q"

(*<*)
notation
  lesubprod  ((_ /<='(_,_') _) [50005150)
(*>*)

lemma unfold_lesub_prod: "x (rA,rB) y = le rA rB x y"
(*<*) by (simp add: lesub_def) (*>*)

lemma le_prod_Pair_conv [iff]: "((a1,b1) (rA,rB) (a2,b2)) = (a1 A a2 & b1 B b2)"
(*<*) by (simp add: lesub_def le_def) (*>*)

lemma less_prod_Pair_conv:
  "((a1,b1) .le rA rB (a2,b2)) =
  (a1 A a2 & b1 B b2 | a1 A a2 & b1 B b2)"
(*<*)
  apply (unfold lesssub_def)
  apply simp
  apply blast
  done
(*>*)

lemma order_le_prodI [iff]: "(order rA A & order rB B) ==> order (Product.le rA rB) (A × B)"
  apply (unfold order_def)
  apply safe
       apply blast+
done 

lemma order_le_prodE: "A {} ==> B {} ==> order (Product.le rA rB) (A × B) ==> (order rA A & order rB B)"
  apply (unfold order_def)
  apply simp
  apply safe
       apply blast+
  done

lemma order_le_prod [iff]: "A {} ==> B {} ==> order(Product.le rA rB) (A × B) = (order rA A & order rB B)"
(*<*)
  apply (unfold order_def)
  apply simp
  apply safe
             apply blast+
  done 

(*>*)

lemma acc_le_prodI [intro!]:
  "[ acc rA; acc rB ] ==> acc(Product.le rA rB)"
(*<*)
apply (unfold acc_def)
apply (rule wf_subset)
 apply (erule wf_lex_prod)
 apply assumption
apply (auto simp add: lesssub_def less_prod_Pair_conv lex_prod_def)
done
(*>*)


lemma closed_lift2_sup:
  "[ closed (err A) (lift2 f); closed (err B) (lift2 g) ] ==>
  closed (err(A×B)) (lift2(sup f g))"
(*<*)
apply (unfold closed_def plussub_def lift2_def err_def' sup_def)
apply (simp split: err.split)
apply blast
done 
(*>*)

lemma unfold_plussub_lift2: "e1 f e2 = lift2 f e1 e2"
(*<*) by (simp add: plussub_def) (*>*)


lemma plus_eq_Err_conv [simp]:
  assumes "xA"  "yA"  "semilat(err A, Err.le r, lift2 f)"
  shows "(x f y = Err) = (¬(zA. x r z y r z))"
(*<*)
proof -
  have plus_le_conv2:
    "r f z. [ z err A; semilat (err A, r, f); OK x err A; OK y err A;
                 OK x f OK y r z] ==> OK x r z OK y r z"
(*<*) by (rule Semilat.plus_le_conv [OF Semilat.intro, THEN iffD1]) (*>*)
  from assms show ?thesis
  apply (rule_tac iffI)
   apply clarify
   apply (drule OK_le_err_OK [THEN iffD2])
   apply (drule OK_le_err_OK [THEN iffD2])
   apply (drule Semilat.lub[OF Semilat.intro, of _ _ _ "OK x" _ "OK y"])
        apply assumption
       apply assumption
      apply simp
     apply simp
    apply simp
   apply simp
  apply (case_tac "x f y")
   apply assumption
  apply (rename_tac "z")
  apply (subgoal_tac "OK z: err A")
  apply (frule plus_le_conv2)
       apply assumption
      apply simp
      apply blast
     apply simp
    apply (blast dest: Semilat.orderI [OF Semilat.intro] order_refl)
   apply blast
  apply (erule subst)
  apply (unfold semilat_def err_def' closed_def)
  apply simp
  done
qed
(*>*)

lemma err_semilat_Product_esl:
  "L1 L2. [ err_semilat L1; err_semilat L2 ] ==> err_semilat(Product.esl L1 L2)"
(*<*)
apply (unfold esl_def Err.sl_def)
apply (simp (no_asm_simp) only: split_tupled_all)
apply simp
apply (simp (no_asm) only: semilat_Def)
apply (simp (no_asm_simp) only: Semilat.closedI [OF Semilat.intro] closed_lift2_sup)
apply (simp (no_asm) only: unfold_lesub_err Err.le_def unfold_plussub_lift2 sup_def)
apply (auto elim: semilat_le_err_OK1 semilat_le_err_OK2
            simp add: lift2_def  split: err.split)
    apply(rule order_le_prodI)
    apply (rule conjI)
apply (blast dest: Semilat.orderI [OF Semilat.intro])
apply (blast dest: Semilat.orderI [OF Semilat.intro])

apply (rule OK_le_err_OK [THEN iffD1])
apply (erule subst, subst OK_lift2_OK [symmetric], rule Semilat.lub [OF Semilat.intro])
apply simp
apply simp
apply simp
apply simp
apply simp
apply simp

apply (rule OK_le_err_OK [THEN iffD1])
apply (erule subst, subst OK_lift2_OK [symmetric], rule Semilat.lub [OF Semilat.intro])
apply simp
apply simp
apply simp
apply simp
apply simp
apply simp
done 
(*>*)

end

Messung V0.5 in Prozent
C=88 H=99 G=93

¤ Dauer der Verarbeitung: 0.10 Sekunden  (vorverarbeitet am  2026-06-10) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.