Как добавить абстракции функций и процедур к денотационной семантике с использованием haskell?

Я хочу написать программу на Haskell для реализации простого императивного языка, основанного на его денотационной семантике. Я использую GHCi, версия 8.4.2 на Windows. Я столкнулся с некоторой проблемой при реализации абстракции функции и процедуры, описанной ниже.

позвольте мне описать это. Я называю это ИМП. Сначала я определяю абстрактный синтаксис. IMP принимает только целые числа. и идентификатор будет строка.

    type      Numeral  = Int      
    type      Ident    = String

    data Command =
                  Skip
                | Assign   (Ident,       Expression)
                | Letin    (Declaration, Command   )
                | Cmdcmd   (Command,     Command   )
                | Ifthen   (Expression,  Command, Command)
                | Whiledo  (Expression,  Command   )
                | IdentifierC ( ActualParameter )

    data Expression =
                Num    Numeral
                | False_
                | True_
                | Notexp   Expression
                | Id       Ident
                | Sumof   (Expression,  Expression)
                | Subof   (Expression,  Expression)
                | Prodof  (Expression,  Expression)
                | Less    (Expression,  Expression)
                | Leten   (Declaration, Expression)
                | IdentifierE ( ActualParameter )
                  deriving Show

    type ActualParameter = Expression

    data FormalParameter = Constfp Identifier

    data Declaration =
              Constdef (Ident,  Expression)
            | Vardef   (Ident,  TypeDef   )
            | Func Identifier ( FormalParameter ) ~ Expression
            | Proce Identifier ( FormalParameter ) ~ Command
              deriving Show

    data TypeDef =
              Bool | Int
              deriving Show

краткое объяснение: в Command Skip ничего не сделает. Назначение даст значение выражения для идентификатора. Letin объявит некоторую переменную в команде. Cmdcmd будет запускать 2 команды последовательно. Если затем это условная команда, если первое выражение оценивается как истина, то выполните первую команду, в противном случае - вторую команду. Пока это петля. IdentifierC ( ActualParameter): IdentifierC обозначает некоторую функцию в локальной среде. этот ActualParameter является некоторым выражением с некоторым значением. эта команда jus вызывает эту функцию с указанным значением.

в выражении сверху вниз: цифра bool false bool true отрицание выражения получить значение Ident из локальной среды. выражения суммы 2 вычитают 2 выражения произведение 2<объявляют некоторую переменную в выражении IdentifierE (ActualParameter) IdentifierE обозначает некоторую функцию в локальной среде. этот ActualParameter является некоторым выражением с некоторым значением. эта команда jus вызывает эту функцию с указанным значением. наконец получил новое значение в результате этого выражения.

тогда есть семантические домены

    type    Integer = Int
    type    Boolean = Bool
    type    Location  = Int
    type    Function = Argument -> Store -> Value
    type    Procedure = Argument -> Store -> Store
    -- store would be snapshot of the memory.

    data    Value   = IntValue    Int
                    | TruthValue  Bool
                      deriving (Eq, Show)
    -- first class value only are int and bool

    type    Storable  = Value

    data    Bindable  = Const Value 
                      | Variable Location 
                      | Function Func 
                      | Procedure Proce
                      deriving (Eq, Show)

    data    Denotable = Unbound | Bound Bindable
                      deriving (Eq, Show)

    type    Argument = Value

    data Sval  = Stored Storable | Undef | Unused

    -- The actual storage in a Store
    type DataStore = Location -> Sval

    --                   --bot---   --top---  --data---
    data Store = Store (Location,  Location,  DataStore)

    type  Environ  =  Ident -> Denotable

    -- ---------- Semantic Functions -------------- --
    valuation :: Int         -> Value
    evaluate  :: Expression  -> Environ -> Store ->  Value
    elaborate :: Declaration -> Environ -> Store ->  (Environ,Store)
    execute   :: Command     -> Environ -> Store ->  Store

    -- the main goal is to define these semantic functions
    -- I give some examples in my source code below.

мой код здесь: https://github.com/sanyuwen/IMP/blob/master/DSemImp.hs. мой тестовый код находится здесь: https://github.com/sanyuwen/IMP/blob/master/ImpTest.hs

Когда я использую GHC для импорта модуля DSemImp, я обнаружил много ошибок.

DSemImp.hs:52:32: error:
    Not in scope: type constructor or class ‘Identifier’
   |
52 | data FormalParameter = Constfp Identifier    |                                ^^^^^^^^^^
It said data FormalParameter = Constfp Identifier is not legal.
without this how can I define formal parameter ??

1 ответ

Вы не определили Identifier, Хотя вы определили Identты это имел ввиду?

Другие вопросы по тегам