ex/Acc.ML
changeset 171 16c4ea954511
parent 127 d9527f97246e
child 244 47aaadf256f6
equal deleted inserted replaced
170:3a8d722fd3ff 171:16c4ea954511
    14 (*The intended introduction rule*)
    14 (*The intended introduction rule*)
    15 val prems = goal Acc.thy
    15 val prems = goal Acc.thy
    16     "[| !!b. <b,a>:r ==> b: acc(r) |] ==> a: acc(r)";
    16     "[| !!b. <b,a>:r ==> b: acc(r) |] ==> a: acc(r)";
    17 by (fast_tac (set_cs addIs (prems @ 
    17 by (fast_tac (set_cs addIs (prems @ 
    18 			    map (rewrite_rule [pred_def]) acc.intrs)) 1);
    18 			    map (rewrite_rule [pred_def]) acc.intrs)) 1);
    19 val accI = result();
    19 qed "accI";
    20 
    20 
    21 goal Acc.thy "!!a b r. [| b: acc(r);  <a,b>: r |] ==> a: acc(r)";
    21 goal Acc.thy "!!a b r. [| b: acc(r);  <a,b>: r |] ==> a: acc(r)";
    22 by (etac acc.elim 1);
    22 by (etac acc.elim 1);
    23 by (rewtac pred_def);
    23 by (rewtac pred_def);
    24 by (fast_tac set_cs 1);
    24 by (fast_tac set_cs 1);
    25 val acc_downward = result();
    25 qed "acc_downward";
    26 
    26 
    27 val [major,indhyp] = goal Acc.thy
    27 val [major,indhyp] = goal Acc.thy
    28     "[| a : acc(r);						\
    28     "[| a : acc(r);						\
    29 \       !!x. [| x: acc(r);  ALL y. <y,x>:r --> P(y) |] ==> P(x)	\
    29 \       !!x. [| x: acc(r);  ALL y. <y,x>:r --> P(y) |] ==> P(x)	\
    30 \    |] ==> P(a)";
    30 \    |] ==> P(a)";
    32 by (rtac indhyp 1);
    32 by (rtac indhyp 1);
    33 by (resolve_tac acc.intrs 1);
    33 by (resolve_tac acc.intrs 1);
    34 by (rewtac pred_def);
    34 by (rewtac pred_def);
    35 by (fast_tac set_cs 2);
    35 by (fast_tac set_cs 2);
    36 be (Int_lower1 RS Pow_mono RS subsetD) 1;
    36 be (Int_lower1 RS Pow_mono RS subsetD) 1;
    37 val acc_induct = result();
    37 qed "acc_induct";
    38 
    38 
    39 
    39 
    40 val [major] = goal Acc.thy "r <= Sigma(acc(r), %u. acc(r)) ==> wf(r)";
    40 val [major] = goal Acc.thy "r <= Sigma(acc(r), %u. acc(r)) ==> wf(r)";
    41 by (rtac (major RS wfI) 1);
    41 by (rtac (major RS wfI) 1);
    42 by (etac acc.induct 1);
    42 by (etac acc.induct 1);
    43 by (rewtac pred_def);
    43 by (rewtac pred_def);
    44 by (fast_tac set_cs 1);
    44 by (fast_tac set_cs 1);
    45 val acc_wfI = result();
    45 qed "acc_wfI";
    46 
    46 
    47 val [major] = goal Acc.thy "wf(r) ==> ALL x. <x,y>: r | <y,x>:r --> y: acc(r)";
    47 val [major] = goal Acc.thy "wf(r) ==> ALL x. <x,y>: r | <y,x>:r --> y: acc(r)";
    48 by (rtac (major RS wf_induct) 1);
    48 by (rtac (major RS wf_induct) 1);
    49 br (impI RS allI) 1;
    49 br (impI RS allI) 1;
    50 br accI 1;
    50 br accI 1;
    51 by (fast_tac set_cs 1);
    51 by (fast_tac set_cs 1);
    52 val acc_wfD_lemma = result();
    52 qed "acc_wfD_lemma";
    53 
    53 
    54 val [major] = goal Acc.thy "wf(r) ==> r <= Sigma(acc(r), %u. acc(r))";
    54 val [major] = goal Acc.thy "wf(r) ==> r <= Sigma(acc(r), %u. acc(r))";
    55 by (rtac subsetI 1);
    55 by (rtac subsetI 1);
    56 by (res_inst_tac [("p", "x")] PairE 1);
    56 by (res_inst_tac [("p", "x")] PairE 1);
    57 by (fast_tac (set_cs addSIs [SigmaI,
    57 by (fast_tac (set_cs addSIs [SigmaI,
    58 			     major RS acc_wfD_lemma RS spec RS mp]) 1);
    58 			     major RS acc_wfD_lemma RS spec RS mp]) 1);
    59 val acc_wfD = result();
    59 qed "acc_wfD";
    60 
    60 
    61 goal Acc.thy "wf(r)  =  (r <= Sigma(acc(r), %u. acc(r)))";
    61 goal Acc.thy "wf(r)  =  (r <= Sigma(acc(r), %u. acc(r)))";
    62 by (EVERY1 [rtac iffI, etac acc_wfD, etac acc_wfI]);
    62 by (EVERY1 [rtac iffI, etac acc_wfD, etac acc_wfI]);
    63 val wf_acc_iff = result();
    63 qed "wf_acc_iff";