packages feed

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

module Logic.Modal.D45 where

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

dfourfive :: Logic FormM
dfourfive = Log { name = "D45"
                , safeRules   = [leftBot, isAxiom, replaceRule safeML]
                , unsafeRules = [boxK45rule,boxD45rule]
                }

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

boxD45rule :: Rule FormM
boxD45rule hs fs _ =
  concatMap (globalLoopCheckMap "☐d45" (fs:hs)) premises
 where
  -- { □Γ1 ∪ □Γ2 }
  lBoxes = Set.filter isLeftBox fs
  -- { □Δ }
  rBoxes = Set.filter isRightBox fs
  -- { Δ }
  deltaS :: [Set.Set (Either FormM FormM)]
  deltaS = Set.toList (Set.powerSet rBoxes)
  -- [(□Γ1, □Γ2)]
  boxGammaPartitions :: [(Set.Set (Either FormM FormM), Set.Set (Either FormM FormM))]
  boxGammaPartitions = partitionDrop lBoxes
  -- □Γ1, Γ2 ⇒ □Δ, φ
  premises :: [Set.Set (Either FormM FormM)]
  premises =
    [ Set.unions
        [ boxGamma1
        , Set.map fromBox boxGamma2
        , delta
        ]
    | delta <- deltaS
    , (boxGamma1, boxGamma2) <- boxGammaPartitions
    ]