Skip to content

Commit 5a98a44

Browse files
Add relation theorems
1 parent 0c89573 commit 5a98a44

2 files changed

Lines changed: 271 additions & 0 deletions

File tree

src/pred_set/src/pred_setScript.sml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9600,4 +9600,39 @@ Proof
96009600
PROVE_TAC [COUNTABLE_NUM]
96019601
QED
96029602

9603+
(* Some theorems for relationTheory consts that require set operations *)
9604+
9605+
Theorem equivalence_thm:
9606+
equivalence = reflexive ∩ symmetric ∩ transitive
9607+
Proof
9608+
SRW_TAC[][FUN_EQ_THM, equivalence_def, SPECIFICATION, CONJ_ASSOC]
9609+
QED
9610+
9611+
Theorem rpreserves_inter:
9612+
rpreserves f b ∧ rpreserves g b ==> rpreserves (f ∩ g) b
9613+
Proof
9614+
SRW_TAC[][rpreserves_def, SPECIFICATION]
9615+
QED
9616+
9617+
Theorem is_closure_inter:
9618+
is_closure_op f a ∧ is_closure_op g b ∧ rpreserves g a ==> is_closure_op (f ∩ g) (a o b)
9619+
Proof
9620+
SRW_TAC[][is_closure_op_def, SPECIFICATION, rpreserves_def]
9621+
>> METIS_TAC[RSUBSET_TRANS]
9622+
QED
9623+
9624+
Theorem is_closure_op_reflexive_transitive_RTC[simp]:
9625+
is_closure_op (reflexive ∩ transitive) RTC
9626+
Proof
9627+
SRW_TAC[][RTC_RC_o_TC, is_closure_inter]
9628+
QED
9629+
9630+
Theorem is_closure_op_equivalence_EQC[simp]:
9631+
is_closure_op equivalence EQC
9632+
Proof
9633+
SRW_TAC[][EQC_THM, equivalence_thm, GSYM INTER_ASSOC]
9634+
>> HO_MATCH_MP_TAC is_closure_inter
9635+
>> SRW_TAC[][rpreserves_inter, Once INTER_COMM, is_closure_inter]
9636+
QED
9637+
96039638
(* END *)

src/relation/relationScript.sml

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

126131
Theorem SC_SYMMETRIC:
127132
!R. symmetric (SC R)
@@ -275,6 +280,12 @@ Proof
275280
SRW_TAC [][transitive_def, RC_DEF] THEN PROVE_TAC []
276281
QED
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+
278289
Theorem TC_SUBSET:
279290
!R x (y:'a). R x y ==> TC R x y
280291
Proof
@@ -552,6 +563,18 @@ Proof
552563
]
553564
QED
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+
555578
Theorem TC_LEFT1_I:
556579
!x y z. R x y /\ TC R y z ==> TC R x z
557580
Proof
@@ -2009,6 +2032,18 @@ val _ = Unicode.unicode_version {u = UnicodeChars.subset ^ UnicodeChars.sub_r,
20092032
val _ = 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+
20122047
Theorem irreflexive_RSUBSET:
20132048
!R1 R2. irreflexive R2 /\ R1 RSUBSET R2 ==> irreflexive R1
20142049
Proof
@@ -2616,3 +2651,204 @@ Theorem RSUBSET_RINSERT :
26162651
Proof
26172652
SRW_TAC [] [RSUBSET, RINSERT]
26182653
QED
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

Comments
 (0)