packages feed

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" []