| 17480 |      1 | (* $Id$ *)
 | 
|  |      2 | 
 | 
|  |      3 | theory If
 | 
|  |      4 | imports FOLP
 | 
|  |      5 | begin
 | 
|  |      6 | 
 | 
|  |      7 | constdefs
 | 
| 19796 |      8 |   "if" :: "[o,o,o]=>o"
 | 
| 17480 |      9 |   "if(P,Q,R) == P&Q | ~P&R"
 | 
|  |     10 | 
 | 
| 25991 |     11 | lemma ifI:
 | 
|  |     12 |   assumes "!!x. x : P ==> f(x) : Q"  "!!x. x : ~P ==> g(x) : R"
 | 
|  |     13 |   shows "?p : if(P,Q,R)"
 | 
|  |     14 | apply (unfold if_def)
 | 
|  |     15 | apply (tactic {* fast_tac (FOLP_cs addIs @{thms assms}) 1 *})
 | 
|  |     16 | done
 | 
|  |     17 | 
 | 
|  |     18 | lemma ifE:
 | 
|  |     19 |   assumes 1: "p : if(P,Q,R)" and
 | 
|  |     20 |     2: "!!x y. [| x : P; y : Q |] ==> f(x, y) : S" and
 | 
|  |     21 |     3: "!!x y. [| x : ~P; y : R |] ==> g(x, y) : S"
 | 
|  |     22 |   shows "?p : S"
 | 
|  |     23 | apply (insert 1)
 | 
|  |     24 | apply (unfold if_def)
 | 
|  |     25 | apply (tactic {* fast_tac (FOLP_cs addIs [@{thm 2}, @{thm 3}]) 1 *})
 | 
|  |     26 | done
 | 
|  |     27 | 
 | 
|  |     28 | lemma if_commute: "?p : if(P, if(Q,A,B), if(Q,C,D)) <-> if(Q, if(P,A,C), if(P,B,D))"
 | 
|  |     29 | apply (rule iffI)
 | 
|  |     30 | apply (erule ifE)
 | 
|  |     31 | apply (erule ifE)
 | 
|  |     32 | apply (rule ifI)
 | 
|  |     33 | apply (rule ifI)
 | 
|  |     34 | oops
 | 
|  |     35 | 
 | 
|  |     36 | ML {* val if_cs = FOLP_cs addSIs [@{thm ifI}] addSEs [@{thm ifE}] *}
 | 
|  |     37 | 
 | 
|  |     38 | lemma if_commute: "?p : if(P, if(Q,A,B), if(Q,C,D)) <-> if(Q, if(P,A,C), if(P,B,D))"
 | 
|  |     39 | apply (tactic {* fast_tac if_cs 1 *})
 | 
|  |     40 | done
 | 
|  |     41 | 
 | 
|  |     42 | lemma nested_ifs: "?p : if(if(P,Q,R), A, B) <-> if(P, if(Q,A,B), if(R,A,B))"
 | 
|  |     43 | apply (tactic {* fast_tac if_cs 1 *})
 | 
|  |     44 | done
 | 
| 17480 |     45 | 
 | 
| 0 |     46 | end
 |