packages feed

GenZ-0.1.0.0: lib/Logic/Modal/K4.hs

module Logic.Modal.K4 where

import qualified Data.Set as Set
import General
import Logic.Modal.K
import FormM

kfour :: Logic FormM
kfour = Log { name = "K4"
            , safeRules   = [leftBot, isAxiom, replaceRule safeML]
            , unsafeRules = [box4rule]
            }

{-
CPL(safe) + ☐4 rule(unsafe + global loopcheck):
      Γ, □Γ ⇒ φ
☐4   Γ', □Γ ⇒ □φ, ∆
-}

box4rule :: Rule FormM
box4rule hs fs (Right (Box f)) = concatMap (globalLoopCheckMap "☐4" (fs:hs)) ss where
  -- add fs as new seqs could be a subset of fs
  ss = Set.map (\s -> Set.unions [Set.singleton (Right f), s, Set.map fromBox s]) ss'
  ss' = Set.powerSet $ Set.filter isLeftBox fs
box4rule _ _ _ = []

-- Global loopcheck: if not already occur (as a subset) in the history.
globalLoopCheckMap :: RuleName -> History FormM -> Sequent FormM -> [(RuleName,[Sequent FormM])]
globalLoopCheckMap r h seqs = [(r, [seqs]) | not $ any (seqs `Set.isSubsetOf`) h]