From 76de232733ed97fa07bed81b45d11656a9a20358 Mon Sep 17 00:00:00 2001 From: Yuri Tatishchev Date: Wed, 4 Feb 2026 11:14:45 -0800 Subject: [PATCH] lab03: init --- lab03/interp.lhs | 115 +++++++++++++++++++++++++++ lab03/semantics.pdf | Bin 0 -> 46379 bytes lab03/semantics.tex | 188 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 303 insertions(+) create mode 100644 lab03/interp.lhs create mode 100644 lab03/semantics.pdf create mode 100644 lab03/semantics.tex diff --git a/lab03/interp.lhs b/lab03/interp.lhs new file mode 100644 index 0000000..5c6af06 --- /dev/null +++ b/lab03/interp.lhs @@ -0,0 +1,115 @@ +This File is _literate Haskell_. +That means that (in some sense) code and comments are reversed. +By default, everything that I type is actually a comment. +To write code, I preface it with a 'greater than' symbol. + +In this lab, we will define a small language and its operational semantics. +We'll first describe the language: + +e ::= true + | false + | if e then e else e + +The "::=" symbol above should be read as "can be", and "|" should be read as "or". +The metavariable "e" represents an expression. +Where needed, we will use "e1", "e2", "e'", etc. as additional metavariables +for expressions. + +Representing this language in Haskell is fairly straightforward. +(Note the use of the '>' to denote code below.) + +> data Exp = ETrue +> | EFalse +> | Eif Exp Exp Exp +> deriving Show + + +We also need to decide what are the valid values in our language. +The metavariable "v" stands for a value; again, we will use "v1", "v2", "v'", etc. +as needed for clarity. +For our initial language, only "true" and "false" will be valid values. +Note that these are **also** valid expresisons in our language. + +v ::= true + | false + +As with our expressions, representing our values in Haskell is straightforward: + +> data Val = VTrue +> | VFalse +> deriving Show + +The next part is to define our "evaluate" function. +We use a downarrow in the slides. +Here we'll use a "->*". + +The first 2 rules define the evaluation of boolean expressions. +The value "true" evaluates to itself, and the value "false" +evaluates to itself. + +------------- +true ->* true + +--------------- +false ->* false + + +The next two rules define the behavior of our if expressions. +Both rules specify that e1 should be evaluated first. +Note that we say "evaluated to" and not "is". +Saying "is" would imply "=", which might not be the case. + +If e1 evaluates to true, then e2 should be evaluated to get our result. +The statements above the line are the "premises" or "preconditions" +that must be true for this rule to apply. + + e1 ->* true e2 ->* v +-------------------------------- + if e1 then e2 else e3 ->* v + +If e1 evalates to false, then e3 should be evaluated to get our result. + + e1 ->* false e3 ->* v +-------------------------------- + if e1 then e2 else e3 ->* v + + +With these rules defined, we can convert them to code. +We represent "->*" with an "evaluate" function. +Note that a "->*" in the premises should translate to a recursive call to evaluate. + +The VTrue case has been done for you. +You must complete the other cases. + + +> evaluate :: Exp -> Val +> evaluate ETrue = VTrue +> evaluate EFalse = error "TBD" +> evaluate (Eif e1 e2 e3) = error "TBD" + + +And here we have a couple of programs to test. +prog1 should evaluate to VTrue and prog2 should evaluate to VFalse + +> prog1 = Eif ETrue ETrue EFalse +> prog2 = Eif (Eif ETrue EFalse ETrue) ETrue (Eif ETrue EFalse ETrue) + +The following lines evaluate the test expressions and display the results. +Note the type of main. 'IO ()' indicates that the function performs IO and returns nothing. +The word 'do' begins a block of code, were you can effectively do sequential statements. +(This is a crude generalization, but we'll talk more about what is going on in this function +when we deal with the great and terrible subject of _monads_.) + +> main :: IO () +> main = do +> putStrLn $ "Evaluating '" ++ (show prog1) ++ "' results in " ++ (show $ evaluate prog1) +> putStrLn $ "Evaluating '" ++ (show prog2) ++ "' results in " ++ (show $ evaluate prog2) + + +Once you have the evaluate function working +you add in support the expressions 'succ e', 'pred e', and integers. +With this change, it is possible for evaluate to get 'stuck', +e.g. pred true. +For a first pass, simply use the error function in these cases. + + diff --git a/lab03/semantics.pdf b/lab03/semantics.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2a3269279afbf4e35ac9b04b5eecb7b46c05b18e GIT binary patch literal 46379 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 V={)}QB1r(N2T@8#$I8xH>c2gS2lM~{ literal 0 HcmV?d00001 diff --git a/lab03/semantics.tex b/lab03/semantics.tex new file mode 100644 index 0000000..9473ff2 --- /dev/null +++ b/lab03/semantics.tex @@ -0,0 +1,188 @@ +\documentclass{article} + +\usepackage{fullpage} +%\usepackage{citesort} +%\usepackage{url} +%\usepackage{listings} +\usepackage{color} + + +% Commands for formatting figures +\newcommand{\mydefhead}[2]{\multicolumn{2}{l}{{#1}}&\mbox{\emph{#2}}\\} +\newcommand{\mydefcase}[2]{\qquad\qquad& #1 &\mbox{#2}\\} + +% Commands for language expressions and values +\newcommand{\true}{\mbox{\tt true}} +\newcommand{\false}{\mbox{\tt false}}\title{Operational Semantics for Bool* Language} +\newcommand{\ife}[3]{\mbox{\tt if}~{#1}~\mbox{\tt then}~{#2}~\mbox{\tt else}~{#3}} +\newcommand{\suc}[1]{\mbox{\tt succ}~{#1}} +\newcommand{\prd}[1]{\mbox{\tt pred}~{#1}} + +% Big-step evaluation relation. +% #1 is the expression. +% #2 is the resulting value. +\newcommand{\bstep}[2]{{#1} \Downarrow {#2}} + +% Command for formatting the name of the evaluation relation. +\newcommand{\rel}[1]{ \mbox{\sc [#1]} } + +% Format for a big-step evaluation rule. +% #1 is the name of the rule. +% #2 are the premises. Leave blank if there are none. +% #3 is the conclusion. +\newcommand{\bsrule}[3]{ + \rel{#1} & + \frac{\strut\begin{array}{@{}c@{}} #2 \end{array}} + {\strut\begin{array}{@{}c@{}} #3 \end{array}} + \\~\\ +} + +\author{ + Thomas H. Austin \\ + San Jos\'{e} State University \\ + thomas.austin@sjsu.edu + } + +\begin{document} +\maketitle + +\begin{abstract} +In this paper, we will provide a review of the big-step operational semantics +for the Bool* language we discussed in class. +\end{abstract} + +%%%% +%\section{Introduction} + +Bool* is a very minimal language that allows us to experiment with operational semantics. + +First, we define the valid expressions in our language. +These expressions dictate the possibilities of what expressions +we may have in our source programs. +(Note that other language might also have {\em statements}. +Statements might not evaluate to a value; +expressions always will.) + +\begin{figure} +\caption{The Bool* language} +\label{fig:lang} +\[ + \begin{array}{ll@{\qquad\qquad}l} + \mydefhead{e ::=\qquad\qquad\qquad\qquad}{Expressions} + \mydefcase{\true}{true value} + \mydefcase{\false}{false value} + \mydefcase{\ife e e e}{conditional expressions} + \\ + \mydefhead{v ::=\qquad\qquad\qquad\qquad}{Values} + \mydefcase{\true}{true value} + \mydefcase{\false}{false value} +\end{array} +\] +\end{figure} + +Figure~\ref{fig:lang} shows the list of expressions and values for the Bool* language. +Expressions can be the value $\true$, the value $\false$, +or the conditional expression $\ife e e e$. +Note that conditional expressions have a recursive structure, +with 3 sub-expressions. + +After evaluating a program, we should be able to produce a value in this language. +(In other languages, we might hit a bad situation and need to crash instead; +that won't happen in this language.) +The valid values for Bool* are $\true$ and $\false$. + +With our expressions and values defined, +we can now specify the semantics for our language. +To do so, we will use the following big-step evaluation relation: + +\[ + \bstep{e}{v} +\] + +The above line should be read as ``the expression $e$ evaluates to the value $v$''. + +\begin{figure} +\caption{Big-step semantics for Bool*} +\label{fig:bigstep} + {\bf Evaluation Rules:~~~ \fbox{$\bstep{e}{v}$}} \\ +\[ +\begin{array}{r@{\qquad\qquad}c} +\bsrule{B-Value}{}{ + \bstep{v}{v} +} +\bsrule{B-IfTrue}{ + \bstep{e_1}{\true} \\ + \bstep{e_2}{v} +}{ + \bstep{\ife{e_1}{e_2}{e_3}}{v} +} +\bsrule{B-IfFalse}{ + \bstep{e_1}{\false} \\ + \bstep{e_3}{v} +}{ + \bstep{\ife{e_1}{e_2}{e_3}}{v} +} +\end{array} +\] +\end{figure} + + + +Figure~\ref{fig:bigstep} shows the big-step evaluation rules for the Bool* language. +Of course, there are additional possible rules. + +The \rel{B-Value} rule applies when the expression (to the left of ``$\Downarrow$'') +is also a value, as defined in Figure~\ref{fig:lang}. +There are no premises for this rule (above the line), +meaning that it is an {\em axiom}. +This rule states that a value evaluates to itself, +so that \true{} evaluates to \true{} and \false{} evaluates to \false{}. + +Two different rules are needed for handling conditional expressions. +Which rule applies depends on the premises. + +For the \rel{B-IfTrue} rule, +the premise states that $e_1$ evaluates to \true{} +and $e_2$ evaluates to some value $v$. +If the premise holds, then the result of evaluating the expression is the value $v$. +The structure of \rel{B-IfFalse} is similar. + + +\section*{Exercise} + +Let's extend the language with new features. +Our new language will be called BoolInt*. +The valid expressions and values are shown below: + +%\begin{figure} +%\caption{The BoolInt* language} +%\label{fig:lang2} +\[ + \begin{array}{ll@{\qquad\qquad}l} + \mydefhead{e ::=\qquad\qquad\qquad\qquad}{Expressions} + \mydefcase{\true}{true value} + \mydefcase{\false}{false value} + \mydefcase{i}{integers} + \mydefcase{\ife e e e}{conditional expressions} + \mydefcase{\suc e}{successor} + \mydefcase{\prd e}{predecessor} + \\ + \mydefhead{v ::=\qquad\qquad\qquad\qquad}{Values} + \mydefcase{\true}{true value} + \mydefcase{\false}{false value} + \mydefcase{i}{integers} +\end{array} +\] +%\end{figure} + +In addition to integers, our expanded language has the ability to increment an integer ($\suc e$) +and decrement an integer ($\prd e$). + +Using LaTeX, write the evaluation rules for these additional constructs. +If necessary, revise any existing rules. + +Then, add these new constructs to the Haskell interpreter that we have been working with. + + +\end{document} +