src/ZF/ex/Contract0.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 16 0b033d50ca1c
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/ex/contract.ML
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Tobias Nipkow & Lawrence C Paulson
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
For ex/contract.thy.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
open Contract0;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
structure Contract = Inductive_Fun
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
 (val thy = Contract0.thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
  val rec_doms = [("contract","comb*comb")];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
  val sintrs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
      ["[| p:comb;  q:comb |] ==> K#p#q -1-> p",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
       "[| p:comb;  q:comb;  r:comb |] ==> S#p#q#r -1-> (p#r)#(q#r)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
       "[| p-1->q;  r:comb |] ==> p#r -1-> q#r",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
       "[| p-1->q;  r:comb |] ==> r#p -1-> r#q"];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
  val monos = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
  val con_defs = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
  val type_intrs = Comb.intrs@[SigmaI];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
  val type_elims = [SigmaE2]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
val [K_contract,S_contract,Ap_contract1,Ap_contract2] = Contract.intrs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
val contract_induct = standard
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
    (Contract.mutual_induct RS spec RS spec RSN (2,rev_mp));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
(*For type checking: replaces a-1->b by a,b:comb *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
val contract_combE2 = Contract.dom_subset RS subsetD RS SigmaE2;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val contract_combD1 = Contract.dom_subset RS subsetD RS SigmaD1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
val contract_combD2 = Contract.dom_subset RS subsetD RS SigmaD2;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
goal Contract.thy "field(contract) = comb";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
by (fast_tac (ZF_cs addIs [equalityI,K_contract] addSEs [contract_combE2]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
val field_contract_eq = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
val reduction_refl = standard
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
    (field_contract_eq RS equalityD2 RS subsetD RS rtrancl_refl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
val rtrancl_into_rtrancl2 = standard
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
    (r_into_rtrancl RS (trans_rtrancl RS transD));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
val reduction_rls = [reduction_refl, K_contract, S_contract, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
		     K_contract RS rtrancl_into_rtrancl2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
		     S_contract RS rtrancl_into_rtrancl2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
		     Ap_contract1 RS rtrancl_into_rtrancl2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
		     Ap_contract2 RS rtrancl_into_rtrancl2];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
goalw Contract.thy [I_def] "!!p. p:comb ==> I#p ---> p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
by (REPEAT (ares_tac (Comb.intrs @ reduction_rls) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
val I_reduce = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
goalw Contract.thy [I_def] "I: comb";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
by (REPEAT (ares_tac Comb.intrs 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
val I_comb = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
(** Non-contraction results **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
(*Derive a case for each combinator constructor*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
val K_contract_case = Contract.mk_cases Comb.con_defs "K -1-> r";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
val S_contract_case = Contract.mk_cases Comb.con_defs "S -1-> r";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
val Ap_contract_case = Contract.mk_cases Comb.con_defs "p#q -1-> r";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
val contract_cs =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
    ZF_cs addSIs Comb.intrs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
	  addIs  Contract.intrs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
	  addSEs [contract_combD1,contract_combD2]     (*type checking*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
	  addSEs [K_contract_case, S_contract_case, Ap_contract_case]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
	  addSEs Comb.free_SEs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
goalw Contract.thy [I_def] "!!r. I -1-> r ==> P";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
by (fast_tac contract_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
val I_contract_case = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
goal Contract.thy "!!p r. K#p -1-> r ==> (EX q. r = K#q & p -1-> q)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
by (fast_tac contract_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
val K1_contractD = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
goal Contract.thy "!!p r. [| p ---> q;  r: comb |] ==> p#r ---> q#r";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
by (forward_tac [rtrancl_type RS subsetD RS SigmaD1] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
by (dtac (field_contract_eq RS equalityD1 RS subsetD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
by (etac rtrancl_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
by (fast_tac (contract_cs addIs reduction_rls) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
by (etac (trans_rtrancl RS transD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
by (fast_tac (contract_cs addIs reduction_rls) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
val Ap_reduce1 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
goal Contract.thy "!!p r. [| p ---> q;  r: comb |] ==> r#p ---> r#q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
by (forward_tac [rtrancl_type RS subsetD RS SigmaD1] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
by (dtac (field_contract_eq RS equalityD1 RS subsetD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
by (etac rtrancl_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
by (fast_tac (contract_cs addIs reduction_rls) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
by (etac (trans_rtrancl RS transD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
by (fast_tac (contract_cs addIs reduction_rls) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
val Ap_reduce2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
(** Counterexample to the diamond property for -1-> **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
goal Contract.thy "K#I#(I#I) -1-> I";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
by (REPEAT (ares_tac [K_contract, I_comb, Ap_comb] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
val KIII_contract1 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
goalw Contract.thy [I_def] "K#I#(I#I) -1-> K#I#((K#I)#(K#I))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
by (DEPTH_SOLVE (resolve_tac (Comb.intrs @ Contract.intrs) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
val KIII_contract2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
goal Contract.thy "K#I#((K#I)#(K#I)) -1-> I";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
by (REPEAT (ares_tac (Comb.intrs @ [K_contract, I_comb]) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
val KIII_contract3 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
goalw Contract.thy [diamond_def] "~ diamond(contract)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
by (fast_tac (ZF_cs addIs [KIII_contract1,KIII_contract2,KIII_contract3]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
                    addSEs [I_contract_case]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
val not_diamond_contract = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
writeln"Reached end of file.";