@@ -122,6 +122,11 @@ val _ = add_rule { fixity = Suffix 2100,
122122 pp_elements = [TOK " ^=" ],
123123 term_name = " EQC" }
124124
125+ Theorem EQC_THM:
126+ EQC = RC o TC o SC
127+ Proof
128+ SRW_TAC[][FUN_EQ_THM, EQC_DEF]
129+ QED
125130
126131Theorem SC_SYMMETRIC:
127132 !R. symmetric (SC R)
@@ -275,6 +280,12 @@ Proof
275280 SRW_TAC [][transitive_def, RC_DEF] THEN PROVE_TAC []
276281QED
277282
283+ Theorem SC_SUBSET:
284+ ∀R x (y: 'a). R x y ==> SC R x y
285+ Proof
286+ SRW_TAC[][SC_DEF]
287+ QED
288+
278289Theorem TC_SUBSET:
279290 !R x (y:'a). R x y ==> TC R x y
280291Proof
@@ -552,6 +563,18 @@ Proof
552563 ]
553564QED
554565
566+ Theorem RTC_TC_o_RC:
567+ RTC = TC o RC
568+ Proof
569+ SRW_TAC[][Once FUN_EQ_THM, TC_RC_EQNS]
570+ QED
571+
572+ Theorem RTC_RC_o_TC:
573+ RTC = RC o TC
574+ Proof
575+ SRW_TAC[][Once FUN_EQ_THM, TC_RC_EQNS]
576+ QED
577+
555578Theorem TC_LEFT1_I:
556579 !x y z. R x y /\ TC R y z ==> TC R x z
557580Proof
@@ -2009,6 +2032,18 @@ val _ = Unicode.unicode_version {u = UnicodeChars.subset ^ UnicodeChars.sub_r,
20092032val _ = TeX_notation { hol = UnicodeChars.subset ^ UnicodeChars.sub_r,
20102033 TeX = (" \\ HOLTokenRSubset{}" , 1 ) }
20112034
2035+ Theorem RSUBSET_REFL:
2036+ R RSUBSET R
2037+ Proof
2038+ SRW_TAC[][RSUBSET]
2039+ QED
2040+
2041+ Theorem RSUBSET_TRANS:
2042+ P RSUBSET Q ∧ Q RSUBSET R ==> P RSUBSET R
2043+ Proof
2044+ SRW_TAC[][RSUBSET]
2045+ QED
2046+
20122047Theorem irreflexive_RSUBSET:
20132048 !R1 R2. irreflexive R2 /\ R1 RSUBSET R2 ==> irreflexive R1
20142049Proof
@@ -2616,3 +2651,204 @@ Theorem RSUBSET_RINSERT :
26162651Proof
26172652 SRW_TAC [] [RSUBSET, RINSERT]
26182653QED
2654+
2655+ (* ==========================================================================
2656+ Some theorems about interaction between the relation operators
2657+ Naming convention used below:
2658+ P, Q, R : relations ('a -> 'a -> bool)
2659+ f, g : predicates on relations ('a -> 'a -> bool) -> bool,
2660+ e.g. reflexive, symmetric, transitive, equivalence
2661+ a, b : relation transformers/operators
2662+ (('a -> 'a -> bool) -> 'a -> 'a -> bool),
2663+ e.g closures like RC, SC, TC, RTC, EQC
2664+ ===========================================================================*)
2665+
2666+ Theorem RUNION_RSUBSET:
2667+ P ∪ᵣ Q ⊆ᵣ R <=> P ⊆ᵣ R ∧ Q ⊆ᵣ R
2668+ Proof
2669+ SRW_TAC[][RUNION, RSUBSET] >> METIS_TAC[]
2670+ QED
2671+
2672+ Theorem RINTER_RSUBSET:
2673+ P ⊆ᵣ R ∨ Q ⊆ᵣ R ==> P ∩ᵣ Q ⊆ᵣ R
2674+ Proof
2675+ SRW_TAC[][RINTER, RSUBSET] >> METIS_TAC[]
2676+ QED
2677+
2678+ Theorem RSUBSET_RUNION:
2679+ R ⊆ᵣ P ∨ R ⊆ᵣ Q ==> R ⊆ᵣ P ∪ᵣ Q
2680+ Proof
2681+ SRW_TAC[][RUNION, RSUBSET] >> METIS_TAC[]
2682+ QED
2683+
2684+ Theorem RSUBSET_RINTER:
2685+ R ⊆ᵣ P ∩ᵣ Q <=> R ⊆ᵣ P ∧ R ⊆ᵣ Q
2686+ Proof
2687+ SRW_TAC[][RINTER, RSUBSET] >> METIS_TAC[]
2688+ QED
2689+
2690+ Theorem INV_RUNION:
2691+ (P ∪ᵣ Q)ᵀ = Pᵀ ∪ᵣ Qᵀ
2692+ Proof
2693+ SRW_TAC[][FUN_EQ_THM, RUNION] >> METIS_TAC[]
2694+ QED
2695+
2696+ Theorem INV_RINTER:
2697+ (P ∩ᵣ Q)ᵀ = Pᵀ ∩ᵣ Qᵀ
2698+ Proof
2699+ SRW_TAC[][FUN_EQ_THM, RINTER] >> METIS_TAC[]
2700+ QED
2701+
2702+ Theorem INV_RSUBSET:
2703+ Pᵀ ⊆ᵣ Q <=> P ⊆ᵣ Qᵀ
2704+ Proof
2705+ SRW_TAC[][EQ_IMP_THM, RSUBSET]
2706+ QED
2707+
2708+ Theorem SC_THM:
2709+ SC R = R ∪ᵣ Rᵀ
2710+ Proof
2711+ SRW_TAC[][SC_DEF, FUN_EQ_THM, RUNION]
2712+ QED
2713+
2714+ Theorem SYMMETRIC_RUNION:
2715+ symmetric P ∧ symmetric Q ==> symmetric (P ∪ᵣ Q)
2716+ Proof
2717+ SRW_TAC[][symmetric_def, RUNION]
2718+ QED
2719+
2720+ Theorem SYMMETRIC_RINTER:
2721+ symmetric P ∧ symmetric Q ==> symmetric (P ∩ᵣ Q)
2722+ Proof
2723+ SRW_TAC[][symmetric_def, RINTER]
2724+ QED
2725+
2726+ (* b respects the ⊆ᵣ relation: enlarging P never shrinks b P *)
2727+ val rmonotone_def = new_definition(
2728+ " rmonotone_def" ,
2729+ ``rmonotone (b: ('a -> 'a -> bool) -> 'a -> 'a -> bool) <=>
2730+ ∀P Q. P ⊆ᵣ Q ==> b P ⊆ᵣ b Q``
2731+ );
2732+
2733+ (* Used to convert existing theorems *)
2734+ Theorem rmonotone_thm:
2735+ rmonotone b <=> ∀y x R Q. (∀x y. R x y ==> Q x y) ==> b R x y ==> b Q x y
2736+ Proof
2737+ SRW_TAC[][rmonotone_def, RSUBSET] >> METIS_TAC[]
2738+ QED
2739+
2740+ (* rmonotone RC ∧ rmonotone SC ∧ rmonotone TC ∧ rmonotone RTC ∧ rmonotone EQC *)
2741+ fun rmonotone_from_thm thm = thm |> GEN_ALL |> MATCH_MP (iffRL rmonotone_thm)
2742+ Theorem rmonotone_closures[simp] =
2743+ [RC_MONOTONE, SC_MONOTONE, TC_MONOTONE, RTC_MONOTONE, EQC_MONOTONE |> Q.INST [`R'` |-> `Q`]]
2744+ |> map rmonotone_from_thm
2745+ |> LIST_CONJ;
2746+
2747+ Theorem rmonotone_RUNION:
2748+ rmonotone ($RUNION P)
2749+ Proof
2750+ SRW_TAC[][rmonotone_def, RUNION_RSUBSET, RSUBSET_RUNION, RSUBSET_REFL]
2751+ QED
2752+
2753+ Theorem rmonotone_RINTER:
2754+ rmonotone ($RINTER P)
2755+ Proof
2756+ SRW_TAC[][rmonotone_def, RINTER_RSUBSET, RSUBSET_RINTER, RSUBSET_REFL]
2757+ QED
2758+
2759+ (* If you have a relation P with property f, then b P also has property f *)
2760+ val rpreserves_def = new_definition(
2761+ " rpreserves_def" ,
2762+ ``rpreserves (f: ('a -> 'a -> bool) -> bool) b <=>
2763+ ∀P. f P ==> f (b P)``
2764+ );
2765+
2766+ Theorem rpreserves_o:
2767+ rpreserves f a ∧ rpreserves f b ==> rpreserves f (a o b)
2768+ Proof
2769+ SRW_TAC[][rpreserves_def]
2770+ QED
2771+
2772+ Theorem rpreserves_reflexive[simp]:
2773+ rpreserves reflexive TC ∧ rpreserves reflexive SC
2774+ Proof
2775+ SRW_TAC[][rpreserves_def, reflexive_def, SC_SUBSET, TC_SUBSET]
2776+ QED
2777+
2778+ Theorem rpreserves_symmetric[simp]:
2779+ rpreserves symmetric RC ∧ rpreserves symmetric TC
2780+ Proof
2781+ SRW_TAC[][rpreserves_def, symmetric_def, RC_SUBSET, TC_SUBSET] >> EQ_TAC
2782+ >| [Q.ID_SPEC_TAC `y` >> Q.ID_SPEC_TAC `x`, Q.ID_SPEC_TAC `x` >> Q.ID_SPEC_TAC `y`]
2783+ >> HO_MATCH_MP_TAC TC_INDUCT_LEFT1 >> SRW_TAC[][TC_SUBSET]
2784+ >> METIS_TAC[TC_RIGHT1_I]
2785+ QED
2786+
2787+ Theorem rpreserves_transitive[simp]:
2788+ rpreserves transitive RC
2789+ Proof
2790+ SRW_TAC[][rpreserves_def, transitive_def, RC_DEF] >> METIS_TAC[]
2791+ QED
2792+
2793+ Theorem rpreserves_symmetric_RTC[simp]:
2794+ rpreserves symmetric RTC
2795+ Proof
2796+ SRW_TAC[][RTC_RC_o_TC, rpreserves_o]
2797+ QED
2798+
2799+ Theorem rpreserves_symmetric_inv:
2800+ rpreserves symmetric b ∧ symmetric R ==> (b R)ᵀ = b Rᵀ
2801+ Proof
2802+ SRW_TAC[][symmetric_inv_identity, rpreserves_def]
2803+ QED
2804+
2805+ (* C is the closure operator for property f, so
2806+ (1) C R has property f
2807+ (2) R ⊆ᵣ C R
2808+ (3) C R is the smallest such relation, in the sense that
2809+ if P is a relation satisfying (1) and (2), then C R ⊆ᵣ P
2810+ *)
2811+ val is_closure_op_def = new_definition(
2812+ " is_closure_op_def" ,
2813+ ``is_closure_op f b <=>
2814+ ∀R. f (b R) ∧ R ⊆ᵣ (b R) ∧ ∀P. f P ∧ R ⊆ᵣ P ==> b R ⊆ᵣ P``
2815+ );
2816+
2817+ Theorem is_closure_op_closed:
2818+ is_closure_op f C ==> f (C R)
2819+ Proof
2820+ SRW_TAC[][is_closure_op_def]
2821+ QED
2822+
2823+ Theorem is_closure_op_reflexive_RC[simp]:
2824+ is_closure_op reflexive RC
2825+ Proof
2826+ SRW_TAC[][is_closure_op_def, RSUBSET, RC_DEF, reflexive_def] >> SRW_TAC[][]
2827+ QED
2828+
2829+ Theorem is_closure_op_symmetric_SC[simp]:
2830+ is_closure_op symmetric SC
2831+ Proof
2832+ SRW_TAC[][is_closure_op_def, RSUBSET, SC_DEF, symmetric_def] >> METIS_TAC[]
2833+ QED
2834+
2835+ Theorem is_closure_op_transitive_TC[simp]:
2836+ is_closure_op transitive TC
2837+ Proof
2838+ SRW_TAC[][is_closure_op_def, RSUBSET, Once TC_DEF, transitive_def]
2839+ >> FIRST_X_ASSUM MP_TAC
2840+ >> Q.ID_SPEC_TAC `y` >> Q.ID_SPEC_TAC `x`
2841+ >> HO_MATCH_MP_TAC TC_INDUCT >> SRW_TAC[][]
2842+ >> METIS_TAC[]
2843+ QED
2844+
2845+ Theorem RMONOTONE_IMP_CLOSURE_RSUBSET:
2846+ is_closure_op f C ∧ rmonotone b ∧ rpreserves f b ==> C (b R) ⊆ᵣ b (C R)
2847+ Proof
2848+ SRW_TAC[][] >> drule $ iffLR is_closure_op_def >> STRIP_TAC
2849+ >> LAST_X_ASSUM $ Q.SPEC_THEN `b R` MP_TAC >> SRW_TAC[][]
2850+ >> FIRST_X_ASSUM irule >> SRW_TAC[][]
2851+ >- METIS_TAC[rpreserves_def, is_closure_op_closed]
2852+ >> METIS_TAC[is_closure_op_def, rmonotone_def]
2853+ QED
2854+
0 commit comments