# Theory FP

Up to index of Isabelle/HOL/UNITY

theory FP
imports UNITY
begin

    (*  Title:      HOL/UNITY/FP
        ID:         $Id: FP.thy,v 1.7 2005/06/17 14:13:10 haftmann Exp $
        Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
        Copyright   1998  University of Cambridge

    From Misra, "A Logic for Concurrent Programming", 1994
    *)

    header{*Fixed Point of a Program*}

    theory FP imports UNITY begin

    constdefs

      FP_Orig :: "'a program => 'a set"
        "FP_Orig F == Union{A. ALL B. F : stable (A Int B)}"

      FP :: "'a program => 'a set"
        "FP F == {s. F : stable {s}}"

    lemma stable_FP_Orig_Int: "F : stable (FP_Orig F Int B)"
    apply (simp only: FP_Orig_def stable_def Int_Union2)
    apply (blast intro: constrains_UN)
    done

    lemma FP_Orig_weakest:
        "(!!B. F : stable (A Int B)) ==> A <= FP_Orig F"
    by (simp add: FP_Orig_def stable_def, blast)

    lemma stable_FP_Int: "F : stable (FP F Int B)"
    apply (subgoal_tac "FP F Int B = (UN x:B. FP F Int {x}) ")
    prefer 2 apply blast
    apply (simp (no_asm_simp) add: Int_insert_right)
    apply (simp add: FP_def stable_def)
    apply (rule constrains_UN)
    apply (simp (no_asm))
    done

    lemma FP_equivalence: "FP F = FP_Orig F"
    apply (rule equalityI)
     apply (rule stable_FP_Int [THEN FP_Orig_weakest])
    apply (simp add: FP_Orig_def FP_def, clarify)
    apply (drule_tac x = "{x}" in spec)
    apply (simp add: Int_insert_right)
    done

    lemma FP_weakest:
        "(!!B. F : stable (A Int B)) ==> A <= FP F"
    by (simp add: FP_equivalence FP_Orig_weakest)

    lemma Compl_FP:
        "-(FP F) = (UN act: Acts F. -{s. act``{s} <= {s}})"
    by (simp add: FP_def stable_def constrains_def, blast)

    lemma Diff_FP: "A - (FP F) = (UN act: Acts F. A - {s. act``{s} <= {s}})"
    by (simp add: Diff_eq Compl_FP)

    lemma totalize_FP [simp]: "FP (totalize F) = FP F"
    by (simp add: FP_def)

    end

lemma stable_FP_Orig_Int:

      F ∈ stable (FP_Orig F ∩ B)

lemma FP_Orig_weakest:

      (!!B. F ∈ stable (A ∩ B)) ==> A ⊆ FP_Orig F

lemma stable_FP_Int:

      F ∈ stable (FP F ∩ B)

lemma FP_equivalence:

      FP F = FP_Orig F

lemma FP_weakest:

      (!!B. F ∈ stable (A ∩ B)) ==> A ⊆ FP F

lemma Compl_FP:

      - FP F = (UN act:Acts F. - {s. act `` {s} ⊆ {s}})

lemma Diff_FP:

      A - FP F = (UN act:Acts F. A - {s. act `` {s} ⊆ {s}})

lemma totalize_FP:

      FP (totalize F) = FP F