Я работаю над упражнением, которое создает дерево деривации языка. Моя реализация в то время как язык состоит из алгебраических типов данных, таких как «Àexp» (Арифметические выражения) «ехр» (логические выражения) и «СТМ» (заявления):Как я могу показать дерево деривации в haskell?
type Var = String
data Aexp = N Integer
| V Var
| Add Aexp Aexp
| Mult Aexp Aexp
| Sub Aexp Aexp
deriving (Show, Eq)
data Bexp = TRUE
| FALSE
| Eq Aexp Aexp
| Le Aexp Aexp
| Neg Bexp
| And Bexp Bexp
deriving (Show, Eq)
data Stm = Ass Var Aexp
| Skip
| Comp Stm Stm
| If Bexp Stm Stm
| While Bexp Stm
| Repeat Stm Bexp
deriving Show
После этих алгебраических типов данных, я создал больше алгебраические типы данных для представления деревьев дериваций программ языка while
type State = Var -> Z
data Config = Inter Stm State -- <S, s>
| Final State -- s
data Transition = Config :-->: State
data DerivTree = AssNS Transition
| SkipNS Transition
| CompNS Transition DerivTree DerivTree
| IfTTNS Transition DerivTree
| IfFFNS Transition DerivTree
| WhileTTNS Transition DerivTree DerivTree
| WhileFFNS Transition
| RepeatTTNS Transition
| RepeatFFNS Transition DerivTree DerivTree
Как я могу показать это дерево деривации?
<z:=x, s> -> s' <x:=,s1> -> s''
----------------------------------
<z:=x; x:=y,s> -> s'' <y:=z,s''> -> s'''
------------------------------------------------------
<z:=x; x:=y; y:=z, s> -> s'''
Ожидаемое значение для каждого конструктора выглядит следующим образом:
Просто сделайте это рекурсивно. Как вы хотите визуализировать дерево, текст, латекс, что-то еще? – Bergi
Что такое 'Config' и' State'? – Bergi
Что вы пробовали и с какими проблемами вы столкнулись? У 'Aexpr',' Bexpr' и 'Stm' действительно есть какое-то отношение к вашей проблеме отображения' DerivTree'? – Cirdec