392 val mksimps_pairs = (@{const_name Nominal.fresh}, @{thms fresh_prodD}) :: mksimps_pairs; |
393 val mksimps_pairs = (@{const_name Nominal.fresh}, @{thms fresh_prodD}) :: mksimps_pairs; |
393 *} |
394 *} |
394 declaration {* fn _ => |
395 declaration {* fn _ => |
395 Simplifier.map_ss (fn ss => ss setmksimps (mksimps mksimps_pairs)) |
396 Simplifier.map_ss (fn ss => ss setmksimps (mksimps mksimps_pairs)) |
396 *} |
397 *} |
397 |
|
398 section {* generalisation of freshness to lists and sets of atoms *} |
|
399 (*================================================================*) |
|
400 |
|
401 consts |
|
402 fresh_star :: "'b \<Rightarrow> 'a \<Rightarrow> bool" ("_ \<sharp>* _" [100,100] 100) |
|
403 |
|
404 defs (overloaded) |
|
405 fresh_star_set: "xs\<sharp>*c \<equiv> \<forall>x\<in>xs. x\<sharp>c" |
|
406 |
|
407 defs (overloaded) |
|
408 fresh_star_list: "xs\<sharp>*c \<equiv> \<forall>x\<in>set xs. x\<sharp>c" |
|
409 |
|
410 lemmas fresh_star_def = fresh_star_list fresh_star_set |
|
411 |
|
412 lemma fresh_star_prod_set: |
|
413 fixes xs::"'a set" |
|
414 shows "xs\<sharp>*(a,b) = (xs\<sharp>*a \<and> xs\<sharp>*b)" |
|
415 by (auto simp add: fresh_star_def fresh_prod) |
|
416 |
|
417 lemma fresh_star_prod_list: |
|
418 fixes xs::"'a list" |
|
419 shows "xs\<sharp>*(a,b) = (xs\<sharp>*a \<and> xs\<sharp>*b)" |
|
420 by (auto simp add: fresh_star_def fresh_prod) |
|
421 |
|
422 lemmas fresh_star_prod = fresh_star_prod_list fresh_star_prod_set |
|
423 |
|
424 lemma fresh_star_set_eq: "set xs \<sharp>* c = xs \<sharp>* c" |
|
425 by (simp add: fresh_star_def) |
|
426 |
|
427 lemma fresh_star_Un_elim: |
|
428 "((S \<union> T) \<sharp>* c \<Longrightarrow> PROP C) \<equiv> (S \<sharp>* c \<Longrightarrow> T \<sharp>* c \<Longrightarrow> PROP C)" |
|
429 apply rule |
|
430 apply (simp_all add: fresh_star_def) |
|
431 apply (erule meta_mp) |
|
432 apply blast |
|
433 done |
|
434 |
|
435 lemma fresh_star_insert_elim: |
|
436 "(insert x S \<sharp>* c \<Longrightarrow> PROP C) \<equiv> (x \<sharp> c \<Longrightarrow> S \<sharp>* c \<Longrightarrow> PROP C)" |
|
437 by rule (simp_all add: fresh_star_def) |
|
438 |
|
439 lemma fresh_star_empty_elim: |
|
440 "({} \<sharp>* c \<Longrightarrow> PROP C) \<equiv> PROP C" |
|
441 by (simp add: fresh_star_def) |
|
442 |
|
443 text {* Normalization of freshness results; cf.\ @{text nominal_induct} *} |
|
444 |
|
445 lemma fresh_star_unit_elim: |
|
446 shows "((a::'a set)\<sharp>*() \<Longrightarrow> PROP C) \<equiv> PROP C" |
|
447 and "((b::'a list)\<sharp>*() \<Longrightarrow> PROP C) \<equiv> PROP C" |
|
448 by (simp_all add: fresh_star_def fresh_def supp_unit) |
|
449 |
|
450 lemma fresh_star_prod_elim: |
|
451 shows "((a::'a set)\<sharp>*(x,y) \<Longrightarrow> PROP C) \<equiv> (a\<sharp>*x \<Longrightarrow> a\<sharp>*y \<Longrightarrow> PROP C)" |
|
452 and "((b::'a list)\<sharp>*(x,y) \<Longrightarrow> PROP C) \<equiv> (b\<sharp>*x \<Longrightarrow> b\<sharp>*y \<Longrightarrow> PROP C)" |
|
453 by (rule, simp_all add: fresh_star_prod)+ |
|
454 |
398 |
455 section {* Abstract Properties for Permutations and Atoms *} |
399 section {* Abstract Properties for Permutations and Atoms *} |
456 (*=========================================================*) |
400 (*=========================================================*) |
457 |
401 |
458 (* properties for being a permutation type *) |
402 (* properties for being a permutation type *) |
1596 shows "(pi\<bullet>a)\<sharp>(pi\<bullet>x) = a\<sharp>x" |
1542 shows "(pi\<bullet>a)\<sharp>(pi\<bullet>x) = a\<sharp>x" |
1597 apply(simp add: pt_fresh_left_ineq[OF pta, OF ptb, OF at, OF cp]) |
1543 apply(simp add: pt_fresh_left_ineq[OF pta, OF ptb, OF at, OF cp]) |
1598 apply(simp add: pt_rev_pi[OF ptb, OF at]) |
1544 apply(simp add: pt_rev_pi[OF ptb, OF at]) |
1599 done |
1545 done |
1600 |
1546 |
1601 lemma pt_fresh_star_bij_ineq: |
|
1602 fixes pi :: "'x prm" |
|
1603 and x :: "'a" |
|
1604 and a :: "'y set" |
|
1605 and b :: "'y list" |
|
1606 assumes pta: "pt TYPE('a) TYPE('x)" |
|
1607 and ptb: "pt TYPE('y) TYPE('x)" |
|
1608 and at: "at TYPE('x)" |
|
1609 and cp: "cp TYPE('a) TYPE('x) TYPE('y)" |
|
1610 shows "(pi\<bullet>a)\<sharp>*(pi\<bullet>x) = a\<sharp>*x" |
|
1611 and "(pi\<bullet>b)\<sharp>*(pi\<bullet>x) = b\<sharp>*x" |
|
1612 apply(unfold fresh_star_def) |
|
1613 apply(auto) |
|
1614 apply(drule_tac x="pi\<bullet>xa" in bspec) |
|
1615 apply(rule pt_set_bij2[OF ptb, OF at]) |
|
1616 apply(assumption) |
|
1617 apply(simp add: fresh_star_def pt_fresh_bij_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
1618 apply(drule_tac x="(rev pi)\<bullet>xa" in bspec) |
|
1619 apply(simp add: pt_set_bij1[OF ptb, OF at]) |
|
1620 apply(simp add: pt_fresh_left_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
1621 apply(drule_tac x="pi\<bullet>xa" in bspec) |
|
1622 apply(simp add: pt_set_bij1[OF ptb, OF at]) |
|
1623 apply(simp add: pt_set_eqvt [OF ptb at] pt_rev_pi[OF pt_list_inst[OF ptb], OF at]) |
|
1624 apply(simp add: pt_fresh_bij_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
1625 apply(drule_tac x="(rev pi)\<bullet>xa" in bspec) |
|
1626 apply(simp add: pt_set_bij1[OF ptb, OF at] pt_set_eqvt [OF ptb at]) |
|
1627 apply(simp add: pt_fresh_left_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
1628 done |
|
1629 |
|
1630 lemma pt_fresh_left: |
1547 lemma pt_fresh_left: |
1631 fixes pi :: "'x prm" |
1548 fixes pi :: "'x prm" |
1632 and x :: "'a" |
1549 and x :: "'a" |
1633 and a :: "'x" |
1550 and a :: "'x" |
1634 assumes pt: "pt TYPE('a) TYPE('x)" |
1551 assumes pt: "pt TYPE('a) TYPE('x)" |
1672 apply(rule at)+ |
1589 apply(rule at)+ |
1673 apply(rule cp_pt_inst) |
1590 apply(rule cp_pt_inst) |
1674 apply(rule pt) |
1591 apply(rule pt) |
1675 apply(rule at) |
1592 apply(rule at) |
1676 done |
1593 done |
1677 |
|
1678 lemma pt_fresh_star_bij: |
|
1679 fixes pi :: "'x prm" |
|
1680 and x :: "'a" |
|
1681 and a :: "'x set" |
|
1682 and b :: "'x list" |
|
1683 assumes pt: "pt TYPE('a) TYPE('x)" |
|
1684 and at: "at TYPE('x)" |
|
1685 shows "(pi\<bullet>a)\<sharp>*(pi\<bullet>x) = a\<sharp>*x" |
|
1686 and "(pi\<bullet>b)\<sharp>*(pi\<bullet>x) = b\<sharp>*x" |
|
1687 apply(rule pt_fresh_star_bij_ineq(1)) |
|
1688 apply(rule pt) |
|
1689 apply(rule at_pt_inst) |
|
1690 apply(rule at)+ |
|
1691 apply(rule cp_pt_inst) |
|
1692 apply(rule pt) |
|
1693 apply(rule at) |
|
1694 apply(rule pt_fresh_star_bij_ineq(2)) |
|
1695 apply(rule pt) |
|
1696 apply(rule at_pt_inst) |
|
1697 apply(rule at)+ |
|
1698 apply(rule cp_pt_inst) |
|
1699 apply(rule pt) |
|
1700 apply(rule at) |
|
1701 done |
|
1702 |
|
1703 lemma pt_fresh_star_eqvt: |
|
1704 fixes pi :: "'x prm" |
|
1705 and x :: "'a" |
|
1706 and a :: "'x set" |
|
1707 and b :: "'x list" |
|
1708 assumes pt: "pt TYPE('a) TYPE('x)" |
|
1709 and at: "at TYPE('x)" |
|
1710 shows "pi\<bullet>(a\<sharp>*x) = (pi\<bullet>a)\<sharp>*(pi\<bullet>x)" |
|
1711 and "pi\<bullet>(b\<sharp>*x) = (pi\<bullet>b)\<sharp>*(pi\<bullet>x)" |
|
1712 by (simp_all add: perm_bool pt_fresh_star_bij[OF pt, OF at]) |
|
1713 |
|
1714 lemma pt_fresh_star_eqvt_ineq: |
|
1715 fixes pi::"'x prm" |
|
1716 and a::"'y set" |
|
1717 and b::"'y list" |
|
1718 and x::"'a" |
|
1719 assumes pta: "pt TYPE('a) TYPE('x)" |
|
1720 and ptb: "pt TYPE('y) TYPE('x)" |
|
1721 and at: "at TYPE('x)" |
|
1722 and cp: "cp TYPE('a) TYPE('x) TYPE('y)" |
|
1723 and dj: "disjoint TYPE('y) TYPE('x)" |
|
1724 shows "pi\<bullet>(a\<sharp>*x) = (pi\<bullet>a)\<sharp>*(pi\<bullet>x)" |
|
1725 and "pi\<bullet>(b\<sharp>*x) = (pi\<bullet>b)\<sharp>*(pi\<bullet>x)" |
|
1726 by (simp_all add: pt_fresh_star_bij_ineq[OF pta, OF ptb, OF at, OF cp] dj_perm_forget[OF dj] perm_bool) |
|
1727 |
1594 |
1728 lemma pt_fresh_bij1: |
1595 lemma pt_fresh_bij1: |
1729 fixes pi :: "'x prm" |
1596 fixes pi :: "'x prm" |
1730 and x :: "'a" |
1597 and x :: "'a" |
1731 and a :: "'x" |
1598 and a :: "'x" |
1879 from c2 ineq have "[(a,c),(b,c),(a,c)] \<triangleq> [(a,b)]" by (simp add: at_ds3[OF at]) |
1745 from c2 ineq have "[(a,c),(b,c),(a,c)] \<triangleq> [(a,b)]" by (simp add: at_ds3[OF at]) |
1880 hence "[(a,c),(b,c),(a,c)]\<bullet>x = [(a,b)]\<bullet>x" by (rule pt3[OF pt]) |
1746 hence "[(a,c),(b,c),(a,c)]\<bullet>x = [(a,b)]\<bullet>x" by (rule pt3[OF pt]) |
1881 thus ?thesis using eq3 by simp |
1747 thus ?thesis using eq3 by simp |
1882 qed |
1748 qed |
1883 |
1749 |
1884 lemma pt_freshs_freshs: |
|
1885 assumes pt: "pt TYPE('a) TYPE('x)" |
|
1886 and at: "at TYPE ('x)" |
|
1887 and pi: "set (pi::'x prm) \<subseteq> Xs \<times> Ys" |
|
1888 and Xs: "Xs \<sharp>* (x::'a)" |
|
1889 and Ys: "Ys \<sharp>* x" |
|
1890 shows "pi \<bullet> x = x" |
|
1891 using pi |
|
1892 proof (induct pi) |
|
1893 case Nil |
|
1894 show ?case by (simp add: pt1 [OF pt]) |
|
1895 next |
|
1896 case (Cons p pi) |
|
1897 obtain a b where p: "p = (a, b)" by (cases p) |
|
1898 with Cons Xs Ys have "a \<sharp> x" "b \<sharp> x" |
|
1899 by (simp_all add: fresh_star_def) |
|
1900 with Cons p show ?case |
|
1901 by (simp add: pt_fresh_fresh [OF pt at] |
|
1902 pt2 [OF pt, of "[(a, b)]" pi, simplified]) |
|
1903 qed |
|
1904 |
|
1905 lemma pt_pi_fresh_fresh: |
1750 lemma pt_pi_fresh_fresh: |
1906 fixes x :: "'a" |
1751 fixes x :: "'a" |
1907 and pi :: "'x prm" |
1752 and pi :: "'x prm" |
1908 assumes pt: "pt TYPE('a) TYPE('x)" |
1753 assumes pt: "pt TYPE('a) TYPE('x)" |
1909 and at: "at TYPE ('x)" |
1754 and at: "at TYPE ('x)" |
2593 and at: "at TYPE('x)" |
2435 and at: "at TYPE('x)" |
2594 and fs: "fs TYPE('a) TYPE('x)" |
2436 and fs: "fs TYPE('a) TYPE('x)" |
2595 shows "a\<sharp>(set xs) = a\<sharp>xs" |
2437 shows "a\<sharp>(set xs) = a\<sharp>xs" |
2596 by (simp add: fresh_def pt_list_set_supp[OF pt, OF at, OF fs]) |
2438 by (simp add: fresh_def pt_list_set_supp[OF pt, OF at, OF fs]) |
2597 |
2439 |
|
2440 |
|
2441 section {* generalisation of freshness to lists and sets of atoms *} |
|
2442 (*================================================================*) |
|
2443 |
|
2444 consts |
|
2445 fresh_star :: "'b \<Rightarrow> 'a \<Rightarrow> bool" ("_ \<sharp>* _" [100,100] 100) |
|
2446 |
|
2447 defs (overloaded) |
|
2448 fresh_star_set: "xs\<sharp>*c \<equiv> \<forall>x\<in>xs. x\<sharp>c" |
|
2449 |
|
2450 defs (overloaded) |
|
2451 fresh_star_list: "xs\<sharp>*c \<equiv> \<forall>x\<in>set xs. x\<sharp>c" |
|
2452 |
|
2453 lemmas fresh_star_def = fresh_star_list fresh_star_set |
|
2454 |
|
2455 lemma fresh_star_prod_set: |
|
2456 fixes xs::"'a set" |
|
2457 shows "xs\<sharp>*(a,b) = (xs\<sharp>*a \<and> xs\<sharp>*b)" |
|
2458 by (auto simp add: fresh_star_def fresh_prod) |
|
2459 |
|
2460 lemma fresh_star_prod_list: |
|
2461 fixes xs::"'a list" |
|
2462 shows "xs\<sharp>*(a,b) = (xs\<sharp>*a \<and> xs\<sharp>*b)" |
|
2463 by (auto simp add: fresh_star_def fresh_prod) |
|
2464 |
|
2465 lemmas fresh_star_prod = fresh_star_prod_list fresh_star_prod_set |
|
2466 |
|
2467 lemma fresh_star_set_eq: "set xs \<sharp>* c = xs \<sharp>* c" |
|
2468 by (simp add: fresh_star_def) |
|
2469 |
|
2470 lemma fresh_star_Un_elim: |
|
2471 "((S \<union> T) \<sharp>* c \<Longrightarrow> PROP C) \<equiv> (S \<sharp>* c \<Longrightarrow> T \<sharp>* c \<Longrightarrow> PROP C)" |
|
2472 apply rule |
|
2473 apply (simp_all add: fresh_star_def) |
|
2474 apply (erule meta_mp) |
|
2475 apply blast |
|
2476 done |
|
2477 |
|
2478 lemma fresh_star_insert_elim: |
|
2479 "(insert x S \<sharp>* c \<Longrightarrow> PROP C) \<equiv> (x \<sharp> c \<Longrightarrow> S \<sharp>* c \<Longrightarrow> PROP C)" |
|
2480 by rule (simp_all add: fresh_star_def) |
|
2481 |
|
2482 lemma fresh_star_empty_elim: |
|
2483 "({} \<sharp>* c \<Longrightarrow> PROP C) \<equiv> PROP C" |
|
2484 by (simp add: fresh_star_def) |
|
2485 |
|
2486 text {* Normalization of freshness results; see \ @{text nominal_induct} *} |
|
2487 |
|
2488 lemma fresh_star_unit_elim: |
|
2489 shows "((a::'a set)\<sharp>*() \<Longrightarrow> PROP C) \<equiv> PROP C" |
|
2490 and "((b::'a list)\<sharp>*() \<Longrightarrow> PROP C) \<equiv> PROP C" |
|
2491 by (simp_all add: fresh_star_def fresh_def supp_unit) |
|
2492 |
|
2493 lemma fresh_star_prod_elim: |
|
2494 shows "((a::'a set)\<sharp>*(x,y) \<Longrightarrow> PROP C) \<equiv> (a\<sharp>*x \<Longrightarrow> a\<sharp>*y \<Longrightarrow> PROP C)" |
|
2495 and "((b::'a list)\<sharp>*(x,y) \<Longrightarrow> PROP C) \<equiv> (b\<sharp>*x \<Longrightarrow> b\<sharp>*y \<Longrightarrow> PROP C)" |
|
2496 by (rule, simp_all add: fresh_star_prod)+ |
|
2497 |
|
2498 |
|
2499 lemma pt_fresh_star_bij_ineq: |
|
2500 fixes pi :: "'x prm" |
|
2501 and x :: "'a" |
|
2502 and a :: "'y set" |
|
2503 and b :: "'y list" |
|
2504 assumes pta: "pt TYPE('a) TYPE('x)" |
|
2505 and ptb: "pt TYPE('y) TYPE('x)" |
|
2506 and at: "at TYPE('x)" |
|
2507 and cp: "cp TYPE('a) TYPE('x) TYPE('y)" |
|
2508 shows "(pi\<bullet>a)\<sharp>*(pi\<bullet>x) = a\<sharp>*x" |
|
2509 and "(pi\<bullet>b)\<sharp>*(pi\<bullet>x) = b\<sharp>*x" |
|
2510 apply(unfold fresh_star_def) |
|
2511 apply(auto) |
|
2512 apply(drule_tac x="pi\<bullet>xa" in bspec) |
|
2513 apply(erule pt_set_bij2[OF ptb, OF at]) |
|
2514 apply(simp add: fresh_star_def pt_fresh_bij_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
2515 apply(drule_tac x="(rev pi)\<bullet>xa" in bspec) |
|
2516 apply(simp add: pt_set_bij1[OF ptb, OF at]) |
|
2517 apply(simp add: pt_fresh_left_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
2518 apply(drule_tac x="pi\<bullet>xa" in bspec) |
|
2519 apply(simp add: pt_set_bij1[OF ptb, OF at]) |
|
2520 apply(simp add: pt_set_eqvt [OF ptb at] pt_rev_pi[OF pt_list_inst[OF ptb], OF at]) |
|
2521 apply(simp add: pt_fresh_bij_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
2522 apply(drule_tac x="(rev pi)\<bullet>xa" in bspec) |
|
2523 apply(simp add: pt_set_bij1[OF ptb, OF at] pt_set_eqvt [OF ptb at]) |
|
2524 apply(simp add: pt_fresh_left_ineq[OF pta, OF ptb, OF at, OF cp]) |
|
2525 done |
|
2526 |
|
2527 lemma pt_fresh_star_bij: |
|
2528 fixes pi :: "'x prm" |
|
2529 and x :: "'a" |
|
2530 and a :: "'x set" |
|
2531 and b :: "'x list" |
|
2532 assumes pt: "pt TYPE('a) TYPE('x)" |
|
2533 and at: "at TYPE('x)" |
|
2534 shows "(pi\<bullet>a)\<sharp>*(pi\<bullet>x) = a\<sharp>*x" |
|
2535 and "(pi\<bullet>b)\<sharp>*(pi\<bullet>x) = b\<sharp>*x" |
|
2536 apply(rule pt_fresh_star_bij_ineq(1)) |
|
2537 apply(rule pt) |
|
2538 apply(rule at_pt_inst) |
|
2539 apply(rule at)+ |
|
2540 apply(rule cp_pt_inst) |
|
2541 apply(rule pt) |
|
2542 apply(rule at) |
|
2543 apply(rule pt_fresh_star_bij_ineq(2)) |
|
2544 apply(rule pt) |
|
2545 apply(rule at_pt_inst) |
|
2546 apply(rule at)+ |
|
2547 apply(rule cp_pt_inst) |
|
2548 apply(rule pt) |
|
2549 apply(rule at) |
|
2550 done |
|
2551 |
|
2552 lemma pt_fresh_star_eqvt: |
|
2553 fixes pi :: "'x prm" |
|
2554 and x :: "'a" |
|
2555 and a :: "'x set" |
|
2556 and b :: "'x list" |
|
2557 assumes pt: "pt TYPE('a) TYPE('x)" |
|
2558 and at: "at TYPE('x)" |
|
2559 shows "pi\<bullet>(a\<sharp>*x) = (pi\<bullet>a)\<sharp>*(pi\<bullet>x)" |
|
2560 and "pi\<bullet>(b\<sharp>*x) = (pi\<bullet>b)\<sharp>*(pi\<bullet>x)" |
|
2561 by (simp_all add: perm_bool pt_fresh_star_bij[OF pt, OF at]) |
|
2562 |
|
2563 lemma pt_fresh_star_eqvt_ineq: |
|
2564 fixes pi::"'x prm" |
|
2565 and a::"'y set" |
|
2566 and b::"'y list" |
|
2567 and x::"'a" |
|
2568 assumes pta: "pt TYPE('a) TYPE('x)" |
|
2569 and ptb: "pt TYPE('y) TYPE('x)" |
|
2570 and at: "at TYPE('x)" |
|
2571 and cp: "cp TYPE('a) TYPE('x) TYPE('y)" |
|
2572 and dj: "disjoint TYPE('y) TYPE('x)" |
|
2573 shows "pi\<bullet>(a\<sharp>*x) = (pi\<bullet>a)\<sharp>*(pi\<bullet>x)" |
|
2574 and "pi\<bullet>(b\<sharp>*x) = (pi\<bullet>b)\<sharp>*(pi\<bullet>x)" |
|
2575 by (simp_all add: pt_fresh_star_bij_ineq[OF pta, OF ptb, OF at, OF cp] dj_perm_forget[OF dj] perm_bool) |
|
2576 |
|
2577 lemma pt_freshs_freshs: |
|
2578 assumes pt: "pt TYPE('a) TYPE('x)" |
|
2579 and at: "at TYPE ('x)" |
|
2580 and pi: "set (pi::'x prm) \<subseteq> Xs \<times> Ys" |
|
2581 and Xs: "Xs \<sharp>* (x::'a)" |
|
2582 and Ys: "Ys \<sharp>* x" |
|
2583 shows "pi\<bullet>x = x" |
|
2584 using pi |
|
2585 proof (induct pi) |
|
2586 case Nil |
|
2587 show ?case by (simp add: pt1 [OF pt]) |
|
2588 next |
|
2589 case (Cons p pi) |
|
2590 obtain a b where p: "p = (a, b)" by (cases p) |
|
2591 with Cons Xs Ys have "a \<sharp> x" "b \<sharp> x" |
|
2592 by (simp_all add: fresh_star_def) |
|
2593 with Cons p show ?case |
|
2594 by (simp add: pt_fresh_fresh [OF pt at] |
|
2595 pt2 [OF pt, of "[(a, b)]" pi, simplified]) |
|
2596 qed |
|
2597 |
|
2598 lemma pt_fresh_star_pi: |
|
2599 fixes x::"'a" |
|
2600 and pi::"'x prm" |
|
2601 assumes pt: "pt TYPE('a) TYPE('x)" |
|
2602 and at: "at TYPE('x)" |
|
2603 and a: "((supp x)::'x set)\<sharp>* pi" |
|
2604 shows "pi\<bullet>x = x" |
|
2605 using a |
|
2606 apply(induct pi) |
|
2607 apply(auto simp add: fresh_star_def fresh_list_cons fresh_prod pt1[OF pt]) |
|
2608 apply(subgoal_tac "((a,b)#pi)\<bullet>x = ([(a,b)]@pi)\<bullet>x") |
|
2609 apply(simp only: pt2[OF pt]) |
|
2610 apply(rule pt_fresh_fresh[OF pt at]) |
|
2611 apply(simp add: fresh_def at_supp[OF at]) |
|
2612 apply(blast) |
|
2613 apply(simp add: fresh_def at_supp[OF at]) |
|
2614 apply(blast) |
|
2615 apply(simp add: pt2[OF pt]) |
|
2616 done |
|
2617 |
2598 section {* Infrastructure lemmas for strong rule inductions *} |
2618 section {* Infrastructure lemmas for strong rule inductions *} |
2599 (*==========================================================*) |
2619 (*==========================================================*) |
2600 |
|
2601 |
2620 |
2602 text {* |
2621 text {* |
2603 For every set of atoms, there is another set of atoms |
2622 For every set of atoms, there is another set of atoms |
2604 avoiding a finitely supported c and there is a permutation |
2623 avoiding a finitely supported c and there is a permutation |
2605 which make 'translates' between both sets. |
2624 which 'translates' between both sets. |
2606 *} |
2625 *} |
2607 lemma at_set_avoiding_aux: |
2626 lemma at_set_avoiding_aux: |
2608 fixes Xs::"'a set" |
2627 fixes Xs::"'a set" |
2609 and As::"'a set" |
2628 and As::"'a set" |
2610 assumes at: "at TYPE('a)" |
2629 assumes at: "at TYPE('a)" |