src/CTT/ex/synth.ML
author wenzelm
Fri, 16 Sep 2005 23:01:29 +0200
changeset 17441 5b5feca0344a
parent 9251 bd57acd44fc1
permissions -rw-r--r--
converted to Isar theory format;
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
17441
5b5feca0344a converted to Isar theory format;
wenzelm
parents: 9251
diff changeset
     9
context (theory "Arith");
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
writeln"discovery of predecessor function";
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    12
Goal 
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    13
 "?a : SUM pred:?A . Eq(N, pred`0, 0)   \
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    14
\                 *  (PROD n:N. Eq(N, pred ` succ(n), n))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
by (resolve_tac reduction_rls 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
by (resolve_tac comp_rls 5);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
by (rew_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
writeln"the function fst as an element of a function type";
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    23
Goal "A type ==> ?a: SUM f:?B . PROD i:A. PROD j:A. Eq(A, f ` <i,j>, i)";
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    24
by (intr_tac []);
0
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);
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    28
by (typechk_tac []);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
writeln"now put in A everywhere";
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    30
by (REPEAT (assume_tac 1));
0
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.*)
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    37
Goal "?a : PROD i:N. Eq(?A, ?b(inl(i)), <0    ,   i>)  \
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    38
\                  * Eq(?A, ?b(inr(i)), <succ(0), i>)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
by (resolve_tac comp_rls 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
by (rew_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
uresult();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
(*Here we allow the type to depend on i.  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
 This prevents the cycle in the first unification (no longer needed).  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
 Requires flex-flex to preserve the dependence.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
 Simpler still: make ?A into a constant type N*N.*)
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    49
Goal "?a : PROD i:N. Eq(?A(i), ?b(inl(i)), <0   ,   i>)   \
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    50
\                 *  Eq(?A(i), ?b(inr(i)), <succ(0),i>)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
writeln"A tricky combination of when and split";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
(*Now handled easily, but caused great problems once*)
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    54
Goal 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
    "?a : PROD i:N. PROD j:N. Eq(?A, ?b(inl(<i,j>)), i)   \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    56
\                          *  Eq(?A, ?b(inr(<i,j>)), j)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
by (intr_tac[]); 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (resolve_tac [ PlusC_inl RS trans_elem ] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
by (resolve_tac comp_rls 4); 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
by (resolve_tac reduction_rls 7);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
by (resolve_tac comp_rls 10);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
by (typechk_tac[]); (*2 secs*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
by (fold_tac basic_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
uresult();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
(*similar but allows the type to depend on i and j*)
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    68
Goal "?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
    69
\                         *   Eq(?A(i,j), ?b(inr(<i,j>)), j)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
(*similar but specifying the type N simplifies the unification problems*)
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    72
Goal "?a : PROD i:N. PROD j:N. Eq(N, ?b(inl(<i,j>)), i)  \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    73
\                         *   Eq(N, ?b(inr(<i,j>)), j)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
writeln"Deriving the addition operator";
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    77
Goal "?c : PROD n:N. Eq(N, ?f(0,n), n)  \
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    78
\                 *  (PROD m:N. Eq(N, ?f(succ(m), n), succ(?f(m,n))))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
by (resolve_tac comp_rls 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
by (rew_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
by (fold_tac arith_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
writeln"The addition function -- using explicit lambdas";
9251
bd57acd44fc1 more tidying. also generalized some tactics to prove "Type A" and
paulson
parents: 1459
diff changeset
    87
Goal
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
  "?c : SUM plus : ?A .  \
1459
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    89
\        PROD x:N. Eq(N, plus`0`x, x)  \
d12da312eff4 expanded tabs
clasohm
parents: 0
diff changeset
    90
\               *  (PROD y:N. Eq(N, plus`succ(y)`x, succ(plus`y`x)))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
by (intr_tac[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
by eqintr_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
by (resolve_tac [TSimp.split_eqn] 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
by (SELECT_GOAL (rew_tac[]) 4);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
by (resolve_tac [TSimp.split_eqn] 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
by (SELECT_GOAL (rew_tac[]) 4);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
by (res_inst_tac [("p","y")] NC_succ 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
  (**  by (resolve_tac comp_rls 3);  caused excessive branching  **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
by (rew_tac[]); 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
by (fold_tac arith_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
writeln"Reached end of file.";