src/CTT/ex/synth.ML
author wenzelm
Wed, 09 Jul 1997 17:00:34 +0200
changeset 3511 da4dd8b7ced4
parent 1459 d12da312eff4
child 9251 bd57acd44fc1
permissions -rw-r--r--
removed obsolete init_pps and init_thy_reader;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
     1
(*  Title:      CTT/ex/synth
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1991  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
writeln"Synthesis examples, using a crude form of narrowing";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
writeln"discovery of predecessor function";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
goal CTT.thy 
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    12
 "?a : SUM pred:?A . Eq(N, pred`0, 0)   \
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    13
\                 *  (PROD n:N. Eq(N, pred ` succ(n), n))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
by (resolve_tac reduction_rls 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
by (resolve_tac comp_rls 5);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
by (rew_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
writeln"the function fst as an element of a function type";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
val prems = goal CTT.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
    "A type ==> ?a: SUM f:?B . PROD i:A. PROD j:A. Eq(A, f ` <i,j>, i)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
by (intr_tac prems);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
by (resolve_tac reduction_rls 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
by (resolve_tac comp_rls 4);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
by (typechk_tac prems);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
writeln"now put in A everywhere";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
by (REPEAT (resolve_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
by (fold_tac basic_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
writeln"An interesting use of the eliminator, when";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
(*The early implementation of unification caused non-rigid path in occur check
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
  See following example.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
goal CTT.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
    "?a : PROD i:N. Eq(?A, ?b(inl(i)), <0    ,   i>)  \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    39
\                 * Eq(?A, ?b(inr(i)), <succ(0), i>)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
by (resolve_tac comp_rls 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
by (rew_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
uresult();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
(*Here we allow the type to depend on i.  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
 This prevents the cycle in the first unification (no longer needed).  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
 Requires flex-flex to preserve the dependence.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
 Simpler still: make ?A into a constant type N*N.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
goal CTT.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
    "?a : PROD i:N. Eq(?A(i), ?b(inl(i)), <0   ,   i>)   \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    52
\                *  Eq(?A(i), ?b(inr(i)), <succ(0),i>)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
writeln"A tricky combination of when and split";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
(*Now handled easily, but caused great problems once*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
goal CTT.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
    "?a : PROD i:N. PROD j:N. Eq(?A, ?b(inl(<i,j>)), i)   \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    58
\                          *  Eq(?A, ?b(inr(<i,j>)), j)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (intr_tac[]); 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
by (resolve_tac [ PlusC_inl RS trans_elem ] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
by (resolve_tac comp_rls 4); 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
by (resolve_tac reduction_rls 7);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
by (resolve_tac comp_rls 10);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
by (typechk_tac[]); (*2 secs*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
by (fold_tac basic_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
uresult();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
(*similar but allows the type to depend on i and j*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
goal CTT.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
    "?a : PROD i:N. PROD j:N. Eq(?A(i,j), ?b(inl(<i,j>)), i) \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    72
\                         *   Eq(?A(i,j), ?b(inr(<i,j>)), j)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
(*similar but specifying the type N simplifies the unification problems*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
goal CTT.thy
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    76
    "?a : PROD i:N. PROD j:N. Eq(N, ?b(inl(<i,j>)), i)  \
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    77
\                         *   Eq(N, ?b(inr(<i,j>)), j)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
writeln"Deriving the addition operator";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
goal Arith.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
   "?c : PROD n:N. Eq(N, ?f(0,n), n)  \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    83
\               *  (PROD m:N. Eq(N, ?f(succ(m), n), succ(?f(m,n))))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
by (resolve_tac comp_rls 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
by (rew_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
by (fold_tac arith_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
writeln"The addition function -- using explicit lambdas";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
goal Arith.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
  "?c : SUM plus : ?A .  \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    94
\        PROD x:N. Eq(N, plus`0`x, x)  \
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    95
\               *  (PROD y:N. Eq(N, plus`succ(y)`x, succ(plus`y`x)))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
by (resolve_tac [TSimp.split_eqn] 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
by (SELECT_GOAL (rew_tac[]) 4);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
by (resolve_tac [TSimp.split_eqn] 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
by (SELECT_GOAL (rew_tac[]) 4);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
by (res_inst_tac [("p","y")] NC_succ 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
  (**  by (resolve_tac comp_rls 3);  caused excessive branching  **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
by (rew_tac[]); 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
by (fold_tac arith_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
writeln"Reached end of file.";