GrammarProducts-0.0.0.2: FormalLanguage/GrammarProduct/Op/Chomsky/Proof.hs
module FormalLanguage.GrammarProduct.Op.Chomsky.Proof where
import Control.Lens
import Control.Lens.Fold
import Control.Newtype ()
import Data.List (genericReplicate)
import Data.Monoid hiding ((<>))
import Data.Semigroup
import qualified Data.Set as S
import Text.Printf
import Data.List (groupBy)
import Data.Function (on)
import Data.Maybe
import Control.Applicative
import Text.PrettyPrint.ANSI.Leijen hiding ((<>))
import Text.Trifecta --
import qualified Data.ByteString.Char8 as B
import Control.Monad.Trans.State.Strict
import Data.Default
import Text.Trifecta.Delta
import FormalLanguage.CFG.Grammar
import FormalLanguage.CFG.PrettyPrint.ANSI
import FormalLanguage.CFG.PrettyPrint.LaTeX
import FormalLanguage.CFG.Parser
import FormalLanguage.GrammarProduct.Op.Chomsky
-- * Proof of associativity of the 2-GNF.
-- | Run the 2-gnf grammar with the TwoGNF monoid which observes the 2 star
-- cases.
cNFassociativity :: (Grammar, Grammar, S.Set Rule, S.Set Rule, Bool)
cNFassociativity = ( l
, r
, (l^.rules) S.\\ (r^.rules)
, (r^.rules) S.\\ (l^.rules)
, l^.rules == r^.rules) where
l = runCNF $ (CNF g <> CNF g) <> CNF g
r = runCNF $ CNF g <> (CNF g <> CNF g)
g = cNFgrammar
cNFs = g where
g = runCNF $ (CNF h <> CNF h)
h = cNFgrammar
showTwo = printDoc $ grammarDoc $ runCNF $ CNF cNFgrammar <> CNF cNFgrammar
-- * The simple 2-gnf grammar to run the proof on.
-- | Very simple 2-gnf form for proofs.
cNFgrammar = case g of
Success g' -> g'
Failure f -> error $ show f
where
g = parseGrammar "testGrammar" twoGNF
twoGNF = unlines
[ "Grammar: CNF"
, "N: A"
, "N: B"
, "N: C"
-- , "N: Sa"
, "T: a"
, "A -> twoN <<< B C"
, "A -> oneT <<< a"
-- , "A -> oneN <<< Sa"
-- , "Sa -> oneT <<< a"
, "//"
]