funcons-tools-0.1.0.0: cbs/Funcons/Core/Values/PrimitiveValues/Booleans.hs
-- GeNeRaTeD fOr: ../../CBS/Funcons/Values/Primitive values/booleans.aterm
{-# LANGUAGE OverloadedStrings #-}
module Funcons.Core.Values.PrimitiveValues.Booleans where
import Funcons.EDSL
entities = []
types = typeEnvFromList
[("booleans",DataTypeMembers [] [DataTypeConstructor "false" (TTuple []),DataTypeConstructor "true" (TTuple [])])]
funcons = libFromList
[("not",StrictFuncon stepNot),("implies",StrictFuncon stepImplies),("and",StrictFuncon stepAnd),("or",StrictFuncon stepOr),("xor",StrictFuncon stepXor),("is-equal",StrictFuncon stepIs_equal),("booleans",NullaryFuncon stepBooleans),("false",NullaryFuncon stepFalse),("true",NullaryFuncon stepTrue)]
-- |
-- /booleans/ is the type of truth-values.
-- /not(_)/ is logical negation.
-- /and(...)/ is logical conjunction of a tuple of /booleans/ .
-- /or(...)/ is logical disjunction of a tuple of /booleans/ .
-- /xor(_,_)/ is exclusive disjunction of two /booleans/ .
-- /implies(_,_)/ is logical implication between two /booleans/ .
-- /is-equal(_,_)/ tests equality of arbitrary /values/ .
not_ fargs = FApp "not" (FTuple fargs)
stepNot fargs =
evalRules [rewrite1,rewrite2] []
where rewrite1 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "false" []] env
rewriteTo (FName "true")
rewrite2 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "true" []] env
rewriteTo (FName "false")
implies_ fargs = FApp "implies" (FTuple fargs)
stepImplies fargs =
evalRules [rewrite1,rewrite2,rewrite3,rewrite4] []
where rewrite1 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "false" [],PADT "false" []] env
rewriteTo (FName "true")
rewrite2 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "false" [],PADT "true" []] env
rewriteTo (FName "true")
rewrite3 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "true" [],PADT "true" []] env
rewriteTo (FName "true")
rewrite4 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "true" [],PADT "false" []] env
rewriteTo (FName "false")
and_ fargs = FApp "and" (FTuple fargs)
stepAnd fargs =
evalRules [rewrite1,rewrite2,rewrite3] []
where rewrite1 = do
let env = emptyEnv
env <- vsMatch fargs [] env
rewriteTo (FName "true")
rewrite2 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "false" [],VPAnnotated (VPSeqVar "B*" StarOp) (TName "booleans")] env
rewriteTo (FName "false")
rewrite3 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "true" [],VPAnnotated (VPSeqVar "B*" StarOp) (TName "booleans")] env
rewriteTermTo (TApp "and" (TTuple [TVar "B*"])) env
or_ fargs = FApp "or" (FTuple fargs)
stepOr fargs =
evalRules [rewrite1,rewrite2,rewrite3] []
where rewrite1 = do
let env = emptyEnv
env <- vsMatch fargs [] env
rewriteTo (FName "false")
rewrite2 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "true" [],VPAnnotated (VPSeqVar "B*" StarOp) (TName "booleans")] env
rewriteTo (FName "true")
rewrite3 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "false" [],VPAnnotated (VPSeqVar "B*" StarOp) (TName "booleans")] env
rewriteTermTo (TApp "or" (TTuple [TVar "B*"])) env
xor_ fargs = FApp "xor" (FTuple fargs)
stepXor fargs =
evalRules [rewrite1,rewrite2,rewrite3,rewrite4] []
where rewrite1 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "false" [],PADT "false" []] env
rewriteTo (FName "false")
rewrite2 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "false" [],PADT "true" []] env
rewriteTo (FName "true")
rewrite3 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "true" [],PADT "false" []] env
rewriteTo (FName "true")
rewrite4 = do
let env = emptyEnv
env <- vsMatch fargs [PADT "true" [],PADT "true" []] env
rewriteTo (FName "false")
is_equal_ fargs = FApp "is-equal" (FTuple fargs)
stepIs_equal fargs =
evalRules [rewrite1,rewrite2] []
where rewrite1 = do
let env = emptyEnv
env <- vsMatch fargs [VPMetaVar "V1",VPMetaVar "V2"] env
env <- sideCondition (SCEquality (TVar "V1") (TVar "V2")) env
rewriteTo (FName "true")
rewrite2 = do
let env = emptyEnv
env <- vsMatch fargs [VPMetaVar "V1",VPMetaVar "V2"] env
env <- sideCondition (SCInequality (TVar "V1") (TVar "V2")) env
rewriteTo (FName "false")
stepFalse = rewritten (ADTVal "false" [])
stepTrue = rewritten (ADTVal "true" [])
stepBooleans = rewriteType "booleans" []