diff --git a/Makefile b/Makefile index cce8e012..d9c99a35 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -agda := $(shell find src -type f -name '*.lagda') -agdai := $(shell find src -type f -name '*.agdai') -markdown := $(subst src/,out/,$(subst .lagda,.md,$(agda))) +agda := $(shell find src tspl -type f -name '*.lagda') +agdai := $(shell find src tspl -type f -name '*.agdai') +markdown := $(subst tspl/,out/,$(subst src/,out/,$(subst .lagda,.md,$(agda)))) PLFA_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) AGDA2HTML_FLAGS := --verbose --link-to-local-agda-names --use-jekyll=out/ @@ -21,6 +21,12 @@ out/%.md: src/%.lagda | out/ | sed '/^Generating.*/d; /^Warning\: HTML.*/d; /^reached from the.*/d; /^\s*$$/d' @sed -i '1 s|---|---\nsrc : $(<)|' $@ +# should fix this -- it's the same as above +out/%.md: tspl/%.lagda | out/ + agda2html $(AGDA2HTML_FLAGS) -i $< -o $@ 2>&1 \ + | sed '/^Generating.*/d; /^Warning\: HTML.*/d; /^reached from the.*/d; /^\s*$$/d' + @sed -i '1 s|---|---\nsrc : $(<)|' $@ + serve: ruby -S bundle exec jekyll serve --incremental diff --git a/tspl/Assignment1.lagda b/tspl/Assignment1.lagda new file mode 100644 index 00000000..674e0092 --- /dev/null +++ b/tspl/Assignment1.lagda @@ -0,0 +1,319 @@ +--- +title : "Assignment1: TSPL Assignment 1" +layout : page +permalink : /Assignment1/ +--- + +\begin{code} +module Assignment1 where +\end{code} + +## YOUR NAME AND EMAIL GOES HERE + +## Introduction + +This assignment is due **4pm Thursday 4 October** (Week 3). + +You must do _all_ the exercises labelled "(recommended)". + +Exercises labelled "(stretch)" are there to provide an extra challenge. +You don't need to do all of these, but should attempt at least a few. + +Exercises without a label are optional, and may be done if you want +some extra practice. + +Submit your homework using the "submit" command. +Please ensure your files execute correctly under Agda! + +## Imports + +\begin{code} +import Relation.Binary.PropositionalEquality as Eq +open Eq using (_≡_; refl; cong; sym) +open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; _≡⟨_⟩_; _∎) +open import Data.Nat using (ℕ; zero; suc; _+_; _*_; _∸_; _≤_; z≤n; s≤s) +open import Data.Nat.Properties using (+-assoc; +-identityʳ; +-suc; +-comm; + ≤-refl; ≤-trans; ≤-antisym; ≤-total; +-monoʳ-≤; +-monoˡ-≤; +-mono-≤) +open import plfa.Relations using (_<_; z n` +Define `m > n` to be the same as `n < m`. +You will need a suitable data declaration, +similar to that used for totality. +(We will show that the three cases are exclusive after we introduce +[negation][plfa.Negation].) + +#### Exercise `+-mono-<` {#plus-mono-less} + +Show that addition is monotonic with respect to strict inequality. +As with inequality, some additional definitions may be required. + +#### Exercise `≤-iff-<` (recommended) {#leq-iff-less} + +Show that `suc m ≤ n` implies `m < n`, and conversely. + +#### Exercise `<-trans-revisited` {#less-trans-revisited} + +Give an alternative proof that strict inequality is transitive, +using the relating between strict inequality and inequality and +the fact that inequality is transitive. + +#### Exercise `o+o≡e` (stretch) {#odd-plus-odd} + +Show that the sum of two odd numbers is even. + +#### Exercise `Bin-predicates` (stretch) {#Bin-predicates} + +Recall that +Exercise [Bin][plfa.Naturals#Bin] +defines a datatype `Bin` of bitstrings representing natural numbers. +Representations are not unique due to leading zeros. +Hence, eleven may be represented by both of the following + + x1 x1 x0 x1 nil + x1 x1 x0 x1 x0 x0 nil + +Define a predicate + + Can : Bin → Set + +over all bitstrings that holds if the bitstring is canonical, meaning +it has no leading zeros; the first representation of eleven above is +canonical, and the second is not. To define it, you will need an +auxiliary predicate + + One : Bin → Set + +that holds only if the bistring has a leading one. A bitstring is +canonical if it has a leading one (representing a positive number) or +if it consists of a single zero (representing zero). + +Show that increment preserves canonical bitstrings. + + Can x + ------------ + Can (inc x) + +Show that converting a natural to a bitstring always yields a +canonical bitstring. + + ---------- + Can (to n) + +Show that converting a canonical bitstring to a natural +and back is the identity. + + Can x + --------------- + to (from x) ≡ x + +\end{code} +(Hint: For each of these, you may first need to prove related +properties of `One`.) diff --git a/tspl/Assignment2.lagda b/tspl/Assignment2.lagda new file mode 100644 index 00000000..5329e017 --- /dev/null +++ b/tspl/Assignment2.lagda @@ -0,0 +1,365 @@ +--- +title : "Assignment2: TSPL Assignment 2" +layout : page +permalink : /Assignment2/ +--- + +\begin{code} +module Assignment2 where +\end{code} + +## YOUR NAME AND EMAIL GOES HERE + +## Introduction + +This assignment is due **4pm Thursday 18 October** (Week 5). + +You must do _all_ the exercises labelled "(recommended)". + +Exercises labelled "(stretch)" are there to provide an extra challenge. +You don't need to do all of these, but should attempt at least a few. + +Exercises without a label are optional, and may be done if you want +some extra practice. + +Submit your homework using the "submit" command. +Please ensure your files execute correctly under Agda! + +## Imports + +\begin{code} +import Relation.Binary.PropositionalEquality as Eq +open Eq using (_≡_; refl; cong; sym) +open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; _≡⟨_⟩_; _∎) +open import Data.Nat using (ℕ; zero; suc; _+_; _*_; _∸_; _≤_; z≤n; s≤s) +open import Data.Nat.Properties using (+-assoc; +-identityʳ; +-suc; +-comm; + ≤-refl; ≤-trans; ≤-antisym; ≤-total; +-monoʳ-≤; +-monoˡ-≤; +-mono-≤) +open import plfa.Relations using (_<_; z n` + +Here "exactly one" means that one of the three must hold, and each implies the +negation of the other two. + + +#### Exercise `⊎-dual-×` (recommended) + +Show that conjunction, disjunction, and negation are related by a +version of De Morgan's Law. + + ¬ (A ⊎ B) ≃ (¬ A) × (¬ B) + +This result is an easy consequence of something we've proved previously. + +Do we also have the following? + + ¬ (A × B) ≃ (¬ A) ⊎ (¬ B) + +If so, prove; if not, give a variant that does hold. + + +#### Exercise `Classical` (stretch) + +Consider the following principles. + + * Excluded Middle: `A ⊎ ¬ A`, for all `A` + * Double Negation Elimination: `¬ ¬ A → A`, for all `A` + * Peirce's Law: `((A → B) → A) → A`, for all `A` and `B`. + * Implication as disjunction: `(A → B) → ¬ A ⊎ B`, for all `A` and `B`. + * De Morgan: `¬ (¬ A × ¬ B) → A ⊎ B`, for all `A` and `B`. + +Show that each of these implies all the others. + + +#### Exercise `Stable` (stretch) + +Say that a formula is _stable_ if double negation elimination holds for it. +\begin{code} +Stable : Set → Set +Stable A = ¬ ¬ A → A +\end{code} +Show that any negated formula is stable, and that the conjunction +of two stable formulas is stable. + + +## Quantifiers + +#### Exercise `∀-distrib-×` (recommended) + +Show that universals distribute over conjunction. +\begin{code} +postulate + ∀-distrib-× : ∀ {A : Set} {B C : A → Set} → + (∀ (x : A) → B x × C x) ≃ (∀ (x : A) → B x) × (∀ (x : A) → C x) +\end{code} +Compare this with the result (`→-distrib-×`) in +Chapter [Connectives][plfa.Connectives]. + +#### Exercise `⊎∀-implies-∀⊎` + +Show that a disjunction of universals implies a universal of disjunctions. +\begin{code} +postulate + ⊎∀-implies-∀⊎ : ∀ {A : Set} { B C : A → Set } → + (∀ (x : A) → B x) ⊎ (∀ (x : A) → C x) → ∀ (x : A) → B x ⊎ C x +\end{code} +Does the converse hold? If so, prove; if not, explain why. + +#### Exercise `∃-distrib-⊎` (recommended) + +Show that existentials distribute over disjunction. +\begin{code} +postulate + ∃-distrib-⊎ : ∀ {A : Set} {B C : A → Set} → + ∃[ x ] (B x ⊎ C x) ≃ (∃[ x ] B x) ⊎ (∃[ x ] C x) +\end{code} + +#### Exercise `∃×-implies-×∃` + +Show that an existential of conjunctions implies a conjunction of existentials. +\begin{code} +postulate + ∃×-implies-×∃ : ∀ {A : Set} { B C : A → Set } → + ∃[ x ] (B x × C x) → (∃[ x ] B x) × (∃[ x ] C x) +\end{code} +Does the converse hold? If so, prove; if not, explain why. + +#### Exercise `∃-even-odd` + +How do the proofs become more difficult if we replace `m * 2` and `1 + m * 2` +by `2 * m` and `2 * m + 1`? Rewrite the proofs of `∃-even` and `∃-odd` when +restated in this way. + +#### Exercise `∃-+-≤` + +Show that `y ≤ z` holds if and only if there exists a `x` such that +`x + y ≡ z`. + +#### Exercise `∃¬-implies-¬∀` (recommended) + +Show that existential of a negation implies negation of a universal. +\begin{code} +postulate + ∃¬-implies-¬∀ : ∀ {A : Set} {B : A → Set} + → ∃[ x ] (¬ B x) + -------------- + → ¬ (∀ x → B x) +\end{code} +Does the converse hold? If so, prove; if not, explain why. + + +#### Exercise `Bin-isomorphism` (stretch) {#Bin-isomorphism} + +Recall that Exercises +[Bin][plfa.Naturals#Bin], +[Bin-laws][plfa.Induction#Bin-laws], and +[Bin-predicates][plfa.Relations#Bin-predicates] +define a datatype of bitstrings representing natural numbers. + + data Bin : Set where + nil : Bin + x0_ : Bin → Bin + x1_ : Bin → Bin + +And ask you to define the following functions and predicates. + + to : ℕ → Bin + from : Bin → ℕ + Can : Bin → Set + +And to establish the following properties. + + from (to n) ≡ n + + ---------- + Can (to n) + + Can x + --------------- + to (from x) ≡ x + +Using the above, establish that there is an isomorphism between `ℕ` and +`∃[ x ](Can x)`. + + +## Decidable + +#### Exercise `_ + + Week + Mon + Wed + Fri + + + 1 + 17 Sep Naturals + 19 Sep Induction + 21 Sep Induction + + + 2 + 24 Sep Relations (Chad) + 26 Sep Relations (Chad) + 28 Sep (no class) + + + 3 + 1 Oct Equality & Isomorphism + 3 Oct Connectives + 5 Oct Negation + + + 4 + 8 Oct Quantifiers + 10 Oct Decidable + 12 Oct (tutorial only) + + + 5 + 15 Oct Lists + 17 Oct (tutorial only) + 19 Oct Lists + + + 6 + 22 Oct Lambda + 24 Oct (no class) + 26 Oct Properties + + + 7 + 29 Oct DeBruijn + 31 Oct More + 2 Nov Inference + + + 8 + 5 Nov (no class) + 7 Nov (tutorial only) + 9 Nov Untyped + + + 9 + 12 Nov (no class) + 14 Nov (tutorial only) + 16 Nov (no class) + + + 10 + 19 Nov (no class) + 21 Nov Propositions as Types + 23 Nov (no class) + + + 11 + 26 Nov (no class) + 28 Nov Quantitative Type Theory (Wen) + 30 Nov (mock exam) + + + +## Assignments + +For instructions on how to set up Agda for PLFA see [Getting Started](/GettingStarted/). + +* [Assignment 1][Assignment1] cw1 due 4pm Thursday 4 October (Week 3) +* [Assignment 2][Assignment2] cw2 due 4pm Thursday 18 October (Week 5) +* [Assignment 3][Assignment3] cw3 due 4pm Thursday 1 November (Week 7) +* [Assignment 4][Assignment4] cw4 due 4pm Thursday 15 November (Week 9) +* [Assignment 5](/tspl/Assignment5.pdf) cw5 due 4pm Thursday 22 November (Week 10) +
+ Use file [Exam][Exam]. Despite the rubric, do **all three questions**. + + +Assignments are submitted by running +``` bash +submit tspl cwN AssignmentN.lagda +``` +where N is the number of the assignment. + +## Mock exam + +Here is the text of the [mock](/tspl/mock.pdf) +and the exam [instructions](/tspl/instructions.pdf). diff --git a/tspl/examhons2018.cls b/tspl/examhons2018.cls new file mode 100644 index 00000000..857d30ce --- /dev/null +++ b/tspl/examhons2018.cls @@ -0,0 +1,1248 @@ + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% I N F O R M A T I C S +% Honours Exam LaTeX Package v0.1 +% +% Created: 12-Oct-2009 by G.O.Passmore. +% Last Updated: 11-07-2017 by G.Hall +% +% Note: We are changing the file and package name of this style +% from year to year, so as to make people aware of the version +% they are using. The format is `examhons.sty' with +% replaced appropriately. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{examhons2016}[2009/10/12 v0.1 (GOP)] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Set the ITO path for status.tex. +% +% * Note that course organisers / exam preparers do not need +% status.tex. When building their exam on their own machines, +% the exam title / date / etc. information will be automatically +% filled-in with dummy values for mock-up purposes. +% +% Once the exam document is processed on the ITO machines, +% however, the mock-up exam title / date / etc. data will be +% overwritten with the officially sanctioned data held in +% the ITO's master status.tex file. +% +% This file resides in the relative path below. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\itostatuspath{../exam-macros/} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Inherit the proper letter class. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\LoadClass[12pt,a4paper]{article} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Take care of `page x of y' the proper way, based on a combination +% of the J. Goldberg (lastpage) method, the C. Huggins (using fh) +% code, woven together with some use of the ifthen package for +% branching on p0 (the exam title page, which shouldn't be num'd). +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\RequirePackage{fancyhdr,ifthen,a4} +\pagestyle{fancy} +\fancyhf{} + +\def\lastpage@putlabel{\addtocounter{page}{-1}% + \immediate\write\@auxout{\string + \newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\AtEndDocument{% + \message{*** Setting LastPage: Make sure you + run LaTeX upon your exam file at least 3 + times to get this right.}% + \clearpage\lastpage@putlabel}% + +\newcommand{\totalpagesoverride}{0} + + {\rfoot{\ifthenelse{\totalpagesoverride=0} + {\ifthenelse{\thepage>0} + {\scriptsize{Page \thepage{} of \pageref{LastPage}}} + {}} + {{\scriptsize{Page \thepage{} of \@forcedtotalpages}}}}} + + +\renewcommand\headrulewidth{0pt} + +\newcommand{\settotalpages}[1]{ + \def\@forcedtotalpages{#1} + \renewcommand{\totalpagesoverride}{1}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Inlining of the EPSF package by Rokicki et al. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newread\epsffilein % file to \read +\newif\ifepsffileok % continue looking for the bounding box? +\newif\ifepsfbbfound % success? +\newif\ifepsfverbose % report what you're making? +\newif\ifepsfdraft % use draft mode? +\newdimen\epsfxsize % horizontal size after scaling +\newdimen\epsfysize % vertical size after scaling +\newdimen\epsftsize % horizontal size before scaling +\newdimen\epsfrsize % vertical size before scaling +\newdimen\epsftmp % register for arithmetic manipulation +\newdimen\pspoints % conversion factor +% +\pspoints=1bp % Adobe points are `big' +\epsfxsize=0pt % Default value, means `use natural size' +\epsfysize=0pt % ditto +% +\def\epsfbox#1{\global\def\epsfllx{72}\global\def\epsflly{72}% + \global\def\epsfurx{540}\global\def\epsfury{720}% + \def\lbracket{[}\def\testit{#1}\ifx\testit\lbracket + \let\next=\epsfgetlitbb\else\let\next=\epsfnormal\fi\next{#1}}% +% +\def\epsfgetlitbb#1#2 #3 #4 #5]#6{\epsfgrab #2 #3 #4 #5 .\\% + \epsfsetgraph{#6}}% +% +\def\epsfnormal#1{\epsfgetbb{#1}\epsfsetgraph{#1}}% +% +\def\epsfgetbb#1{% +% +% The first thing we need to do is to open the +% PostScript file, if possible. +% +\openin\epsffilein=#1 +\ifeof\epsffilein\errmessage{I couldn't open #1, will ignore it}\else +% +% Okay, we got it. Now we'll scan lines until we find one that doesn't +% start with %. We're looking for the bounding box comment. +% + {\epsffileoktrue \chardef\other=12 + \def\do##1{\catcode`##1=\other}\dospecials \catcode`\ =10 + \loop + \read\epsffilein to \epsffileline + \ifeof\epsffilein\epsffileokfalse\else +% +% We check to see if the first character is a % sign; +% if not, we stop reading (unless the line was entirely blank); +% if so, we look further and stop only if the line begins with +% `%%BoundingBox:'. +% + \expandafter\epsfaux\epsffileline:. \\% + \fi + \ifepsffileok\repeat + \ifepsfbbfound\else + \ifepsfverbose\message{No bounding box comment in #1; using defaults}\fi\fi + }\closein\epsffilein\fi}% +% +% Now we have to calculate the scale and offset values to use. +% First we compute the natural sizes. +% +\def\epsfclipon{\def\epsfclipstring{ clip}}% +\def\epsfclipoff{\def\epsfclipstring{\ifepsfdraft\space clip\fi}}% +\epsfclipoff +% +\def\epsfsetgraph#1{% + \epsfrsize=\epsfury\pspoints + \advance\epsfrsize by-\epsflly\pspoints + \epsftsize=\epsfurx\pspoints + \advance\epsftsize by-\epsfllx\pspoints +% +% If `epsfxsize' is 0, we default to the natural size of the picture. +% Otherwise we scale the graph to be \epsfxsize wide. +% + \epsfxsize\epsfsize\epsftsize\epsfrsize + \ifnum\epsfxsize=0 \ifnum\epsfysize=0 + \epsfxsize=\epsftsize \epsfysize=\epsfrsize + \epsfrsize=0pt +% +% We have a sticky problem here: TeX doesn't do floating point arithmetic! +% Our goal is to compute y = rx/t. The following loop does this reasonably +% fast, with an error of at most about 16 sp (about 1/4000 pt). +% + \else\epsftmp=\epsftsize \divide\epsftmp\epsfrsize + \epsfxsize=\epsfysize \multiply\epsfxsize\epsftmp + \multiply\epsftmp\epsfrsize \advance\epsftsize-\epsftmp + \epsftmp=\epsfysize + \loop \advance\epsftsize\epsftsize \divide\epsftmp 2 + \ifnum\epsftmp>0 + \ifnum\epsftsize<\epsfrsize\else + \advance\epsftsize-\epsfrsize \advance\epsfxsize\epsftmp \fi + \repeat + \epsfrsize=0pt + \fi + \else \ifnum\epsfysize=0 + \epsftmp=\epsfrsize \divide\epsftmp\epsftsize + \epsfysize=\epsfxsize \multiply\epsfysize\epsftmp + \multiply\epsftmp\epsftsize \advance\epsfrsize-\epsftmp + \epsftmp=\epsfxsize + \loop \advance\epsfrsize\epsfrsize \divide\epsftmp 2 + \ifnum\epsftmp>0 + \ifnum\epsfrsize<\epsftsize\else + \advance\epsfrsize-\epsftsize \advance\epsfysize\epsftmp \fi + \repeat + \epsfrsize=0pt + \else + \epsfrsize=\epsfysize + \fi + \fi +% +% Finally, we make the vbox and stick in a \special that dvips can parse. +% + \ifepsfverbose\message{#1: width=\the\epsfxsize, height=\the\epsfysize}\fi + \epsftmp=10\epsfxsize \divide\epsftmp\pspoints + \vbox to\epsfysize{\vfil\hbox to\epsfxsize{% + \ifnum\epsfrsize=0\relax + \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space + llx=\epsfllx\space lly=\epsflly\space + urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp + \epsfclipstring}% + \else + \epsfrsize=10\epsfysize \divide\epsfrsize\pspoints + \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space + llx=\epsfllx\space lly=\epsflly\space + urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp\space + rhi=\number\epsfrsize \epsfclipstring}% + \fi + \hfil}}% +\global\epsfxsize=0pt\global\epsfysize=0pt}% +% +% We still need to define the tricky \epsfaux macro. This requires +% a couple of magic constants for comparison purposes. +% +{\catcode`\%=12 \global\let\epsfpercent=%\global\def\epsfbblit{%BoundingBox}}% +% +% So we're ready to check for `%BoundingBox:' and to grab the +% values if they are found. +% +\long\def\epsfaux#1#2:#3\\{\ifx#1\epsfpercent + \def\testit{#2}\ifx\testit\epsfbblit + \epsfgrab #3 . . . \\% + \epsffileokfalse + \global\epsfbbfoundtrue + \fi\else\ifx#1\par\else\epsffileokfalse\fi\fi}% +% +% Here we grab the values and stuff them in the appropriate definitions. +% +\def\epsfempty{}% +\def\epsfgrab #1 #2 #3 #4 #5\\{% +\global\def\epsfllx{#1}\ifx\epsfllx\epsfempty + \epsfgrab #2 #3 #4 #5 .\\\else + \global\def\epsflly{#2}% + \global\def\epsfurx{#3}\global\def\epsfury{#4}\fi}% +% +% We default the epsfsize macro. +% +\def\epsfsize#1#2{\epsfxsize} +% +% Finally, another definition for compatibility with older macros. +% +\let\epsffile=\epsfbox + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Inlining of the UK date package by A. Clark. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@cent{\count0 } +\def\@diy{\count1 } +\def\@dow{\count2 } +\def\@epact{\count3 } +\def\@golden{\count4 } +\def\@leap{\count5 } +\def\@x{\count6 } +\def\@y{\count7 } + +\def\@up#1{{\@savestyle\thinspace$^{\underline{\hbox{% + \scriptsize\@setstyle#1\fam=-1 }}}$}} +\def\st{\@up{st}} +\def\nd{\@up{nd}} +\def\rd{\@up{rd}} +\def\th{\@up{th}} + +\def\@savestyle{\count0=\the\fam} +\def\@setstyle{\ifcase\count0\rm\or\mit\or\cal\or\rm + \or\it\or\sl\or\bf\or\tt\fi} + +\def\today{\dayofweek{} \number\day\ifcase\day + \or\st\or\nd\or\rd\or\th\or\th\or\th\or\th\or\th\or\th\or\th + \or\th\or\th\or\th\or\th\or\th\or\th\or\th\or\th\or\th\or\th + \or\st\or\nd\or\rd\or\th\or\th\or\th\or\th\or\th\or\th\or\th\or\st\fi + \space\ifcase\month\or January\or February\or March\or April\or May\or + June\or July\or August\or September\or October\or November\or December\fi + \space\number\year} + +\def\dayofweek{{% + \@leap=\month \advance\@leap by -14 \divide\@leap by 12 + \advance\@leap by \year + \@dow=\month \advance\@dow by 10 + \@y=\@dow \divide\@y by 13 \multiply\@y by 12 + \advance\@dow by -\@y \multiply\@dow by 13 + \advance\@dow by -1 \divide\@dow by 5 + \advance\@dow by \day \advance\@dow by 77 + \@x=\@leap \@y=\@x \divide\@y by 100 \multiply\@y by 100 \advance\@x by -\@y + \multiply\@x by 5 \divide\@x by 4 \advance\@dow by \@x + \@x=\@leap \divide\@x by 400 \advance\@dow by \@x + \@x=\@leap \divide\@x by 100 \multiply\@x by 2 \advance\@dow by -\@x + \@x=\@dow \divide\@x by 7 \multiply\@x by 7 \advance\@dow by -\@x + \ifcase\@dow Sunday\or Monday\or Tuesday\or Wednesday\or + Thursday\or Friday\or Saturday\fi}} +\def\phaseofmoon{{% + \@diy=\day \advance\@diy by \ifcase\month + -1\or -1\or 30\or 58\or 89\or 119\or 150\or + 180\or 211\or 241\or 272\or 303\or 333\fi + \ifnum \month>2 + \@x=\year \@y=\@x \divide\@y by 4 \multiply\@y by 4 \advance\@x by -\@y + \ifnum \@x=0 + \@x=\year \@y=\@x \divide\@y by 400 + \multiply\@y by 400 \advance\@x by -\@y + \ifnum \@x=0 + \advance\@diy by 1 + \else + \@x=\year \@y=\@x \divide\@y by 100 + \multiply\@y by 100 \advance\@x by -\@y + \ifnum \@x>0 + \advance\@diy by 1 + \fi + \fi + \fi + \fi + \@cent=\year \divide\@cent by 100 \advance\@cent by 1 + \@golden=\year + \@y=\year \divide\@y by 19 \multiply\@y by 19 \advance\@golden by -\@y + \advance\@golden by 1 + \@epact=11 \multiply\@epact by \@golden + \advance\@epact by 20 + \@x=8 \multiply\@x by \@cent \advance\@x by 5 + \divide\@x by 25 \advance\@x by -5 + \advance\@epact by \@x + \@x=3 \multiply\@x by \@cent \divide\@x by 4 \advance\@x by -12 + \advance\@epact by -\@x + \@y=\@epact \divide\@y by 30 \multiply\@y by 30 \advance\@epact by -\@y + \ifnum \@epact<0 + \advance\@epact by 30 + \fi + \ifnum \@epact=25 + \ifnum \@golden>11 + \advance \@epact by 1 + \fi + \else + \ifnum \@epact=24 + \advance \@epact by 1 + \fi + \fi + \@x=\@diy \advance\@x by \@epact \multiply\@x by 6 \advance\@x by 11 + \@y=\@x \divide\@y by 177 \multiply\@y by 177 \advance\@x by -\@y + \divide\@x by 22 + \ifcase\@x new\or waxing crescent\or in its first quarter\or + waxing gibbous\or full\or waning gibbous\or + in its last quarter\or waning crescent\or new\fi}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Now, we want to define commands for exam title, time, conveners, +% and so on, *but* we want to provide hard-coded dummy values +% for exam preparers who are working on their own machines. +% This is so that status.tex does not need to be ever copied from +% the ITO installation; it is only for ITO. +% +% The logic here is simple. If we find \itostatuspath status.tex +% to exist, then we populate the values of exam title, time, and +% so on using those it contains corresponding to \courseid, which +% is set by the exam preparer using the \setcourse command. +% This is done internally by executing a command named +% \details, with replaced by their courseid. +% +% Otherwise, we use dummy values, but we've gone to the effort to +% at least include the correct course title and type (Inf3,MSc,..) +% within these mock values so as to keep the preparer happy ;-). +% +% Once that's done, we need to work out the rubric. The rubric +% is printed on the title page and is set by the exam author +% using the \setrubric command. They have the following options: +% +% {qu1_and_either_qu2_or_qu3, any_two_of_three, custom}. +% +% Again, the usage of this information follows the same structure +% as above. On an ITO machine, the master files are sourced from +% the itostatuspath directory. On an exam preparer's machine, +% we generate mock-up values for the rubric form and type. +% +% Note, if they create a custom rubric, they must then execute: +% +% \setrubricform{} and \setrubrictype to specify the custom +% rubric information. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\coursestatusfcn}{} +\newcommand{\courseid}{} +\newcommand{\rubricid}{} +\newcommand{\rubricform}{} +\newcommand{\rubrictype}{} + +\providecommand{\status}{} + +\newcommand{\setcourse}[1]{ + \renewcommand{\courseid}{#1} +} + +\newcommand{\setrubric}[1]{\renewcommand{\rubricid}{#1}} +\newcommand{\setrubricform}[1]{\renewcommand{\rubricform}{#1}} +\newcommand{\setrubrictype}[1]{\renewcommand{\rubrictype}{#1}} + +\AtBeginDocument{ + \newcounter{Day} \setcounter{Day}{\day} + \newcounter{Month} \setcounter{Month}{\month} + \newcounter{Year} \setcounter{Year}{\year} +} + +\newenvironment{hint}{\par[{\bf Hint:} }{\nolinebreak]} +\newenvironment{hints}{\par[{\bf Hints:} }{\nolinebreak]} +\newenvironment{note}{\par[{\bf Note:} }{\nolinebreak]} +\newenvironment{notes}{\par[{\bf Notes:} }{\nolinebreak]} + +\def\ps@header{\let\@mkboth\@gobbletwo + \let\@oddfoot\@empty\let\@evenhead\@empty\let\@evenfoot\@oddfoot} +\def\setstatus#1{\def\@status{#1}} +\def\@status{} +\def\@nextone{f}\def\@nextbutone{f}% +\def\@oddhead{{\bf\it \@status}\hfil\it\@conthead} +\def\@conthead{\if\@nextone t\relax QUESTION CONTINUED FROM PREVIOUS PAGE\fi\xdef\@nextone{\@nextbutone}\gdef\@nextbutone{f}} +\def\continued{% +\gdef\@nextbutone{t} +\par\rightline{\it QUESTION CONTINUES ON NEXT PAGE}\newpage% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Display the exam status (for `internal'/`external' scrutiny, or +% `final' which will print no corresponding notice). +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\internal{ + \setstatus{\it FOR INTERNAL SCRUTINY (date of this version: \theDay/\theMonth/\theYear)}} +\def\external{ + \setstatus{\it FOR EXTERNAL EXAMINER (date of this version: \theDay/\theMonth/\theYear)}} +\def\final{\setstatus{}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Setup the proper marks displays. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\Marks#1#2{\marginpar{\raisebox{#2\baselineskip}{[{\it #1 + \ifnum #1=1 mark\else marks\fi\/}]}}} +%Version for most situations. +\def\marks#1{\Marks{#1}{0}} +% The next version is to get around the problem that you cannot put a +% marginpar in maths display. Put \marksl just before the display line. +\def\marksd#1{\Marks{#1}{-2}} +% As above but raises the box. +\def\marksu#1{\Marks{#1}{1}} + +\leftmargini=0pt + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% EPS macros by KK. +% +% The first argument is the filename and the second the size (of the +% x-axis or the y-axis respectively. +% +% For example \psfigx{graph1.epsf}{5in} will input your first graph +% and make the x-axis equal to 4.5in, with the y-axis appropriately +% scaled. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\psfigx#1#2{ + \begin{center} + \leavevmode + \epsfxsize=#2 + \epsffile{#1} + \end{center}} + +\def\psfigy#1#2{ + \begin{center} + \leavevmode + \epsfysize=#2 + \epsffile{#1} + \end{center}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Commands for manipulating exam course data. +% +% We will use them to assign dummy values on exam preparer machines, +% and otherwise will source the master ITO status.tex if it exists +% (e.g., when we are compiling on an ITO machine). +% +% Also, the papertype.inc files and rubric.inc files will be +% loaded if we are on an ITO machine. Otherwise, we will provide +% dummy mock-up values for those as well. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand\papertitle[1]{\global\def\nameofpaper{\uppercase{#1}}} +\newcommand\papertype[1]{\global\def\typeofpaper{ + \InputIfFileExists{\itostatuspath #1}{} + { + % + % If we're here, then this is running on exam preparer's + % machine. So, we will use mock-up values for the exam + % type text corresponding to #1. + % + % Options for #1 are {msc.inc, inf4msc.inc, inf3.inc, inf4.inc, + % nonhons.inc}. + % + + \ifthenelse{\equal{#1}{msc.inc}} + {MSc Courses + \vskip 0.1in + Convener: ITO-Will-Determine\\ + External Examiners: ITO-Will-Determine}{} + \ifthenelse{\equal{#1}{inf4msc.inc}} + {Year 4 Courses + \vskip 0.1in + Convener: ITO-Will-Determine\\ + External Examiners: ITO-Will-Determine + \vskip 0.5in + MSc Courses + \vskip 0.1in + Convener: ITO-Will-Determine\\ + External Examiners: ITO-Will-Determine}{} + \ifthenelse{\equal{#1}{inf3inf4.inc}} + {Year 3 Courses + \vskip 0.1in + Convenor: ITO-Will-Determine\\ + External Examiners: ITO-Will-Determine + \vskip 0.5in + Year 4 Courses + \vskip 0.1in + Convener: ITO-Will-Determine\\ + External Examiners: ITO-Will-Determine}{} + \ifthenelse{\equal{#1}{inf3.inc}} + {Year 3 Courses + \vskip 0.1in + Convener: ITO-Will-Determine\\ + External Examiners: ITO-Will-Determine}{} + \ifthenelse{\equal{#1}{inf4.inc}} + {Year 4 Courses + \vskip 0.1in + Convener: ITO-Will-Determine\\ + External Examiners: ITO-Will-Determine}{} + \ifthenelse{\equal{#1}{nonhons}} + {\vskip 0.2in + Convener: ITO-Will-Determine\\ + External Examiner: ITO-Will-Determine}{}}}} + +\newcommand{\paperdate}[3]{\global\def\day{#1}\global\def\month{#2}\global\def\year{#3}} +\newcommand{\papertimes}[2]{\global\def\timeofpaper{#1 to #2}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Now, we first see if we're on an ITO machine and can load the +% proper status.tex. If so, we do it and execute the corresponding +% \coursestatusfcn. +% +% Otherwise, based upon the value of courseid, we need to populate +% the title and type with basic mock-up data. +% +% This command must be called in the top-level exam document, after +% the courseid has been set. +% +% To do so: \initcoursedata +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\initcoursedata}{ + \IfFileExists{\itostatuspath status.tex} + { + % + % If we're here, then we're on an ITO machine. + % + + \input{\itostatuspath status.tex} + + % + % We've loaded status.tex properly then, and can now execute + % the corresponding \XXXdetails command. + % + + \ifthenelse{\equal{\courseid}{anlp}} + {\anlpdetails}{} + \ifthenelse{\equal{\courseid}{aleone}} + {\aleonedetails}{} + \ifthenelse{\equal{\courseid}{adbs}} + {\adbsdetails}{} + \ifthenelse{\equal{\courseid}{av}} + {\avdetails}{} + \ifthenelse{\equal{\courseid}{apl}} + {\apldetails}{} + \ifthenelse{\equal{\courseid}{abs}} + {\absdetails}{} + \ifthenelse{\equal{\courseid}{agta}} + {\agtadetails}{} + \ifthenelse{\equal{\courseid}{ads}} + {\adsdetails}{} + \ifthenelse{\equal{\courseid}{ad}} + {\addetails}{} + \ifthenelse{\equal{\courseid}{ar}} + {\ardetails}{} + \ifthenelse{\equal{\courseid}{asr}} + {\asrdetails}{} + \ifthenelse{\equal{\courseid}{bioone}} + {\bioonedetails}{} + \ifthenelse{\equal{\courseid}{biotwo}} + {\biotwodetails}{} + \ifthenelse{\equal{\courseid}{bdl}} + {\bdldetails}{} + \ifthenelse{\equal{\courseid}{cqi}} + {\cqidetails}{} + \ifthenelse{\equal{\courseid}{copt}} + {\coptdetails}{} + \ifthenelse{\equal{\courseid}{ct}} + {\ctdetails}{} + \ifthenelse{\equal{\courseid}{ccs}} + {\ccsdetails}{} + \ifthenelse{\equal{\courseid}{cmc}} + {\cmcdetails}{} + \ifthenelse{\equal{\courseid}{ca}} + {\cadetails}{} + \ifthenelse{\equal{\courseid}{cav}} + {\cavdetails}{} + \ifthenelse{\equal{\courseid}{car}} + {\cardetails}{} + \ifthenelse{\equal{\courseid}{comn}} + {\comndetails}{} + \ifthenelse{\equal{\courseid}{cd}} + {\cddetails}{} + \ifthenelse{\equal{\courseid}{cg}} + {\cgdetails}{} + \ifthenelse{\equal{\courseid}{cn}} + {\cndetails}{} + \ifthenelse{\equal{\courseid}{cp}} + {\cpdetails}{} + \ifthenelse{\equal{\courseid}{cs}} + {\csdetails}{} + \ifthenelse{\equal{\courseid}{dme}} + {\dmedetails}{} + \ifthenelse{\equal{\courseid}{dds}} + {\ddsdetails}{} + \ifthenelse{\equal{\courseid}{dbs}} + {\dbsdetails}{} + \ifthenelse{\equal{\courseid}{dmmr}} + {\dmmrdetails}{} + \ifthenelse{\equal{\courseid}{dmr}} + {\dmrdetails}{} + \ifthenelse{\equal{\courseid}{ds}} + {\dsdetails}{} + \ifthenelse{\equal{\courseid}{epl}} + {\epldetails}{} + \ifthenelse{\equal{\courseid}{es}} + {\esdetails}{} + \ifthenelse{\equal{\courseid}{exc}} + {\excdetails}{} + \ifthenelse{\equal{\courseid}{fv}} + {\fvdetails}{} + \ifthenelse{\equal{\courseid}{fnlp}} + {\fnlpdetails}{} + \ifthenelse{\equal{\courseid}{hci}} + {\hcidetails}{} + \ifthenelse{\equal{\courseid}{infonecg}} + {\infonecgdetails}{} + \ifthenelse{\equal{\courseid}{infonecl}} + {\infonecldetails}{} + \ifthenelse{\equal{\courseid}{infoneda}} + {\infonedadetails}{} + \ifthenelse{\equal{\courseid}{infonefp}} + {\infonefpdetails}{} + \ifthenelse{\equal{\courseid}{infonefpam}} + {\infonefpamdetails}{} + \ifthenelse{\equal{\courseid}{infonefppm}} + {\infonefppmdetails}{} + \ifthenelse{\equal{\courseid}{infoneop}} + {\infoneopdetails}{} + \ifthenelse{\equal{\courseid}{infoneopam}} + {\infoneopamdetails}{} + \ifthenelse{\equal{\courseid}{infoneoppm}} + {\infoneoppmdetails}{} + \ifthenelse{\equal{\courseid}{inftwoa}} + {\inftwoadetails}{} + \ifthenelse{\equal{\courseid}{inftwob}} + {\inftwobdetails}{} + \ifthenelse{\equal{\courseid}{inftwoccs}} + {\inftwoccsdetails}{} + \ifthenelse{\equal{\courseid}{inftwocse}} + {\inftwocsedetails}{} + \ifthenelse{\equal{\courseid}{inftwod}} + {\inftwoddetails}{} + \ifthenelse{\equal{\courseid}{iar}} + {\iardetails}{} + \ifthenelse{\equal{\courseid}{imc}} + {\imcdetails}{} + \ifthenelse{\equal{\courseid}{iotssc}} + {\iotsscdetails}{} + \ifthenelse{\equal{\courseid}{iqc}} + {\iqcdetails}{} + \ifthenelse{\equal{\courseid}{itcs}} + {\itcsdetails}{} + \ifthenelse{\equal{\courseid}{ivc}} + {\ivcdetails}{} + \ifthenelse{\equal{\courseid}{ivr}} + {\ivrdetails}{} + \ifthenelse{\equal{\courseid}{iaml}} + {\iamldetails}{} + \ifthenelse{\equal{\courseid}{lpt}} + {\lptdetails}{} + \ifthenelse{\equal{\courseid}{lpp}} + {\lppdetails}{} + \ifthenelse{\equal{\courseid}{mlpr}} + {\mlprdetails}{} + \ifthenelse{\equal{\courseid}{mt}} + {\mtdetails}{} + \ifthenelse{\equal{\courseid}{mi}} + {\midetails}{} + \ifthenelse{\equal{\courseid}{nlu}} + {\nludetails}{} + \ifthenelse{\equal{\courseid}{nc}} + {\ncdetails}{} + \ifthenelse{\equal{\courseid}{nip}} + {\nipdetails}{} + \ifthenelse{\equal{\courseid}{os}} + {\osdetails}{} + \ifthenelse{\equal{\courseid}{pa}} + {\padetails}{} + \ifthenelse{\equal{\courseid}{pdiot}} + {\pdiotdetails}{} + \ifthenelse{\equal{\courseid}{ppls}} + {\pplsdetails}{} + \ifthenelse{\equal{\courseid}{pm}} + {\pmdetails}{} + \ifthenelse{\equal{\courseid}{pmr}} + {\pmrdetails}{} + \ifthenelse{\equal{\courseid}{pi}} + {\pidetails}{} + \ifthenelse{\equal{\courseid}{rc}} + {\rcdetails}{} + \ifthenelse{\equal{\courseid}{rl}} + {\rldetails}{} + \ifthenelse{\equal{\courseid}{rlsc}} + {\rlscdetails}{} + \ifthenelse{\equal{\courseid}{rss}} + {\rssdetails}{} + \ifthenelse{\equal{\courseid}{sp}} + {\spdetails}{} + \ifthenelse{\equal{\courseid}{sws}} + {\swsdetails}{} + \ifthenelse{\equal{\courseid}{stn}} + {\stndetails}{} + \ifthenelse{\equal{\courseid}{sapm}} + {\sapmdetails}{} + \ifthenelse{\equal{\courseid}{sdm}} + {\sdmdetails}{} + \ifthenelse{\equal{\courseid}{st}} + {\stdetails}{} + \ifthenelse{\equal{\courseid}{ttds}} + {\ttdsdetails}{} + \ifthenelse{\equal{\courseid}{tspl}} + {\tspldetails}{} + + } + { + % + % If we're here, then we're on an exam preparer's machine. + % So, we're going to use their set \courseid to give some + % nice mock-up values to the title and type text. + % + + \ifthenelse{\equal{\courseid}{anlp}} + {\papertitle{INFR 11125 Accelerated Natural Language Processing} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{aleone}} + {\papertitle{Adaptive Learning Environments (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{adbs}} + {\papertitle{Advanced Databases} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{av}} + {\papertitle{Advanced Vision (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{apl}} + {\papertitle{Advances in Programming Languages} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{abs}} + {\papertitle{Agent Based Systems} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{agta}} + {\papertitle{Algorithmic Game Theory and its Applications} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{ads}} + {\papertitle{Algorithms and Data Structures} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{ad}} + {\papertitle{INFR11015 Applied Databases} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{ar}} + {\papertitle{Automated Reasoning (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{asr}} + {\papertitle{Automatic Speech Recognition} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{bioone}} + {\papertitle{Bioinformatics 1} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{biotwo}} + {\papertitle{Bioinformatics 2} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{bdl}} + {\papertitle{INFR11144 Blockchains and Distributed Ledgers} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{cqi}} + {\papertitle{Categories and Quantum Informatics} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{copt}} + {\papertitle{Compiler Optimisation (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{ct}} + {\papertitle{Compiling Techniques} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{ccs}} + {\papertitle{Computational Cognitive Science} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{cmc}} + {\papertitle{Computational Complexity} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{ca}} + {\papertitle{Computer Algebra} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{cav}} + {\papertitle{Computer Animation and Visualisation (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{car}} + {\papertitle{Computer Architecture} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{comn}} + {\papertitle{Computer Communications and Networks} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{cd}} + {\papertitle{Computer Design} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{cg}} + {\papertitle{Computer Graphics (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{cn}} + {\papertitle{Computer Networking (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{cp}} + {\papertitle{Computer Programming Skills and Concepts} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{cs}} + {\papertitle{Computer Security} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{dds}} + {\papertitle{INFR08024 Data, Design and Society} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{dme}} + {\papertitle{Data Mining and Exploration} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{dbs}} + {\papertitle{Database Systems} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{dmr}} + {\papertitle{Decision Making in Robots and Autonomous Agents} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{dmmr}} + {\papertitle{Discrete Mathematics and Mathematical Reasoning} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{ds}} + {\papertitle{Distributed Systems (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{epl}} + {\papertitle{INFR10061 Elements of Programming Languages} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{es}} + {\papertitle{Embedded Software} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{exc}} + {\papertitle{Extreme Computing} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{fv}} + {\papertitle{Formal Verification} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{fnlp}} + {\papertitle{Foundations of Natural Language Processing} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{hci}} + {\papertitle{Human-Computer Interaction (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{infonecg}} + {\papertitle{Informatics 1 --- Cognitive Science} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infonecl}} + {\papertitle{Informatics 1 --- Computation \& Logic} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infoneda}} + {\papertitle{Informatics 1 --- Data \& Analysis} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infonefp}} + {\papertitle{Informatics 1 --- Functional Programming} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infonefpam}} + {\papertitle{Informatics 1 --- Functional Programming} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infonefppm}} + {\papertitle{Informatics 1 --- Functional Programming} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infoneop}} + {\papertitle{Informatics 1 --- Object-Oriented Programming} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infoneopam}} + {\papertitle{Informatics 1 --- Object-Oriented Programming} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{infoneoppm}} + {\papertitle{Informatics 1 --- Object-Oriented Programming} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{inftwoa}} + {\papertitle{Informatics 2A: Processing Formal and Natural Languages} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{inftwob}} + {\papertitle{Informatics 2B: Algorithms, Data Structures, Learning} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{inftwoccs}} + {\papertitle{Informatics 2C: Introduction to Computer Systems} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{inftwocse}} + {\papertitle{Informatics 2C: Introduction to Software Engineering} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{inftwod}} + {\papertitle{Informatics 2D: Reasoning and Agents} + \papertype{nonhons.inc}}{} + \ifthenelse{\equal{\courseid}{iar}} + {\papertitle{Intelligent Autonomous Robotics (Level 10)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{imc}} + {\papertitle{Introduction to Modern Cryptography} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{iotssc}} + {\papertitle{Internet of Things Systems, Security, and the Cloud} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{iqc}} + {\papertitle{Introduction to Quantum Computing} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{itcs}} + {\papertitle{Introduction to Theoretical Computer Science} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{ivc}} + {\papertitle{Image and Vision Computing} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{ivr}} + {\papertitle{Introduction to Vision and Robotics} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{iaml}} + {\papertitle{Introductory Applied Machine Learning} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{lpt}} + {\papertitle{Logic Programming --- Theory} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{lpp}} + {\papertitle{Logic Programming --- Programming} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{mlpr}} + {\papertitle{Machine Learning and Pattern Recognition} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{mt}} + {\papertitle{Machine Translation (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{mi}} + {\papertitle{INFR11079 Music Informatics} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{nlu}} + {\papertitle{Natural Language Understanding (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{nc}} + {\papertitle{Neural Computation} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{nip}} + {\papertitle{Neural Information Processing} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{os}} + {\papertitle{Operating Systems} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{pa}} + {\papertitle{Parallel Architectures (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{pdiot}} + {\papertitle{Principles and Design of IoT Systems} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{ppls}} + {\papertitle{Parallel Programming Languages and Systems (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{pm}} + {\papertitle{Performance Modelling} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{pmr}} + {\papertitle{Probabilistic Modelling and Reasoning} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{pi}} + {\papertitle{Professional Issues} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{rc}} + {\papertitle{Randomness and Computation} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{rl}} + {\papertitle{Reinforcement Learning} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{rlsc}} + {\papetitle{Robot Learning and Sensorimotor Control} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{rss}} + {\papertitle{Robotics: Science and Systems} + \papertype{msc.inc}}{} + \ifthenelse{\equal{\courseid}{sp}} + {\papertitle{INFR11098 Secure Programming} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{sws}} + {\papertitle{INFR11104 Semantic Web Systems} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{stn}} + {\papertitle{INFR11124 Social and Technological Networks} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{sapm}} + {\papertitle{Software Architecture, Process and Management (Level 11)} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{sdm}} + {\papertitle{Software Design and Modelling} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{st}} + {\papertitle{Software Testing} + \papertype{inf3.inc}}{} + \ifthenelse{\equal{\courseid}{ttds}} + {\papertitle{Text Technologies for Data Science} + \papertype{inf4.inc}}{} + \ifthenelse{\equal{\courseid}{tspl}} + {\papertitle{Types and Semantics for Programming Languages} + \papertype{inf4.inc}}{} + + % \ifthenelse{\equal{\courseid}{XXX}} + % { }{} + + % + % Let's also do a mock-up date/time to make the exam preparer happy: + % (Aren't we sweet?) + % + + \paperdate{1}{4}{2017} + \papertimes{00:00}{00:00} + + % + % Also, we'll set the exam status to internal for the mock-up. + % + + \internal + + }} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Now, we can build the appropriate rubric form and type. +% +% We set rubric type and form to alert values. These will be over- +% written if the author has done things right. Otherwise, they +% will provide good error messages to the author. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setrubricform{Rubric Form has not been initialized.} +\setrubrictype{Rubric type has not been initialized.} + +\newcommand{\initrubricdata}{ + + % + % We need to load both form and type data for the rubric. + % + % If we're on an ITO machine, we'll load it from the master path. + % If not, we'll setup some mock-up values. + % + % We only do this if the rubric is not custom, though. + % + % This section also defines \rubricqA, B and C. These are initialised as empty definitions + % and then the correct text is added depending on the rubric selected + % + \def\rubricqA{} + \def\rubricqB{} + \def\rubricqC{} + + \ifthenelse{\equal{\rubricid}{custom}}{} + { + %% HONS RUBRICS + + \ifthenelse{\equal{\rubricid}{qu1_and_either_qu2_or_qu3}}{ + \setrubrictype{ + Answer QUESTION 1 and ONE other question. \\ + \bigskip + Question 1 is COMPULSORY. If both QUESTION 2 and QUESTION 3 are answered, only QUESTION 2 will be marked. \\ + \bigskip + All questions carry equal weight.\\ + \bigskip + CALCULATORS MAY NOT BE USED IN THIS EXAMINATION \\ + } + + %% Additional command to be used for question 1. + \def\rubricqA{THIS QUESTION IS COMPULSORY} + \def\rubricqB{ANSWER EITHER THIS QUESTION OR QUESTION 3} + \def\rubricqC{ANSWER EITHER THIS QUESTION OR QUESTION 2} + }{} + + \ifthenelse{\equal{\rubricid}{qu1_and_either_qu2_or_qu3_calc}}{ + \setrubrictype{ + Answer QUESTION 1 and ONE other question. \\ + \bigskip + Question 1 is COMPULSORY. If both QUESTION 2 and QUESTION 3 are answered, only QUESTION 2 will be marked. \\ + \bigskip + All questions carry equal weight.\\ + \bigskip + + CALCULATORS MAY BE USED IN THIS EXAMINATION \\ + } + + %% Additional command to be used for question 1. + \def\rubricqA{THIS QUESTION IS COMPULSORY} + \def\rubricqB{ANSWER EITHER THIS QUESTION OR QUESTION 3} + \def\rubricqC{ANSWER EITHER THIS QUESTION OR QUESTION 2} + }{} + + \ifthenelse{\equal{\rubricid}{any_two_of_three}}{ + \setrubrictype{ + Answer any TWO of the three questions. If more than two questions are answered, only QUESTION 1 and QUESTION 2 will be marked.\\ + \bigskip + All questions carry equal weight.\\ + \bigskip + CALCULATORS MAY NOT BE USED IN THIS EXAMINATION \\ + } + }{} + + \ifthenelse{\equal{\rubricid}{any_two_of_three_calc}}{ + \setrubrictype{ + Answer any TWO of the three questions. If more than two questions are answered, only QUESTION 1 and QUESTION 2 will be marked.\\ + \bigskip + All questions carry equal weight.\\ + \bigskip + CALCULATORS MAY BE USED IN THIS EXAMINATION \\ + } + }{} + + \ifthenelse{\equal{\rubricid}{infone}}{ + \setrubrictype{ + \begin{enumerate} + \item Note that ALL QUESTIONS ARE COMPULSORY. + \item DIFFERENT QUESTIONS MAY HAVE DIFFERENT NUMBERS OF TOTAL MARKS. + Take note of this in allocating time to questions. + \item CALCULATORS MAY NOT BE USED IN THIS EXAMINATION. + \end{enumerate} + } + }{} + + \ifthenelse{\equal{\rubricid}{infone_calcs}}{ + \setrubrictype{ + \begin{enumerate} + \item Note that ALL QUESTIONS ARE COMPULSORY. + \item DIFFERENT QUESTIONS MAY HAVE DIFFERENT NUMBERS OF TOTAL MARKS. + Take note of this in allocating time to questions. + \item CALCULATORS MAY BE USED IN THIS EXAMINATION. + \end{enumerate} + } + }{} + + \ifthenelse{\equal{\rubricid}{infone_openbook}}{ + \setrubrictype{ + \begin{enumerate} + \item Note that ALL QUESTIONS ARE COMPULSORY. + \item DIFFERENT QUESTIONS MAY HAVE DIFFERENT NUMBERS OF TOTAL MARKS. + Take note of this in allocating time to questions. + \item This is an OPEN BOOK examination: notes and printed material are allowed, + but no electronic devices or electronic media. + \end{enumerate} + } + }{} + + } +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Now, we can build the title page. This command must be called +% from the top-level exam document. +% +% To do so: \examtitlepage +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\newcommand{\examtitlepage}{ + +\initrubricdata + +\status + +\thispagestyle{header} +\begin{center} + {UNIVERSITY OF EDINBURGH} + \vskip 0.1in + {COLLEGE OF SCIENCE AND ENGINEERING} + \vskip 0.1in + {SCHOOL OF INFORMATICS} + \vskip 0.5in + +\begin{bf} +{\nameofpaper} + +\begin{small} +\vskip 0.5in +{\today} \\ +\vskip 0.2in +{\timeofpaper} +\vskip 0.75in +\end{small} + +{INSTRUCTIONS TO CANDIDATES} \\ +\bigskip\bigskip + +\rubrictype +\end{bf} + +\vskip 0.5in + +\begin{small} +{\typeofpaper} +\end{small} + +\vskip 0.5in +THIS EXAMINATION WILL BE MARKED ANONYMOUSLY + +\end{center} + +\setcounter{page}{0} +\newpage + +\status +} + + diff --git a/tspl/instructions.pdf b/tspl/instructions.pdf new file mode 100644 index 00000000..0eb17918 Binary files /dev/null and b/tspl/instructions.pdf differ diff --git a/tspl/instructions.tex b/tspl/instructions.tex new file mode 100644 index 00000000..5e924fc8 --- /dev/null +++ b/tspl/instructions.tex @@ -0,0 +1,122 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Instructions for TSPL Exam +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[12pt]{article} +\usepackage{a4,amssymb} +% \setlength{\oddsidemargin}{-1.5cm} +% \addtolength{\textwidth}{2cm} +% \addtolength{\textheight}{3cm} + +\begin{document} +\pagestyle{empty} +\setcounter{page}{1} + +\begin{center} +\large Types and Semantics for Programming Languages +\end{center} + +\section*{Instructions} + +\begin{enumerate} + +\item + The exam lasts two hours. + +\item + Place your student identity card face-up on the desk in front of you. The + invigilator may come to check your identity, and in this case you may be asked + to allow the invigilator to briefly use your computer. The exam time has been + calculated to allow time for such interruptions. + +\item + You may log into your computer as soon as you are ready to do so. + +\item + To download the exam paper, open a terminal window and type: + \begin{center} + \texttt{getpapers} + \end{center} + This will create a subdirectory \texttt{tspl-pe} in your home directory, + containing the following files. + \begin{center} + \begin{tabular}{ll} + \texttt{tspl-pe/papers/exam.pdf} & the exam \\ + \texttt{tspl-pe/papers/instructions.pdf} & these instructions \\ + \texttt{tspl-pe/templates/Exam.lagda} & exam template to edit \\ + \texttt{tspl-pe/original\_templates/Exam.lagda} & backup of exam template + \end{tabular} + \end{center} + The directories \texttt{tspl-pe/papers} and + \texttt{tspl-pe/original\_templates} + are read only, but you may read and write \texttt{tspl-pe/templates}. + +\item + To setup the Agda environment, open a second terminal window and type: + \begin{center} + \texttt{tspl-setup} + \end{center} + This will open a browser, with three tabs which contain the textbook + \emph{Programming Language Foundations in Agda}, the documentation for the + Agda standard library, and the documentation for Agda. (The browser may + also attempt to link to the internet, which brings up a tab labeled + ``Problem loading page''; this is expected and not a problem.) + +{\it (Note that internet access has been disabled.)} + +\begin{center} + \textbf{Do nothing further until the start of the exam is announced!} +\end{center} + +\hfill \textit{Please Turn Over} +\newpage + +\item When the start of the exam is announced, open the exam paper +\begin{center} + \texttt{tspl-pe/papers/exam.pdf} +\end{center} +with the standard PDF viewer. + +\item Change to the template directory +\begin{center} + \texttt{cd tspl-pe/templates} +\end{center} +and edit the file +\begin{center} + \texttt{Exam.lagda} +\end{center} +to include your answers, using Emacs or anything else suitable. +You are recommended to save your work on a regular basis. + +\item Before submitting, make sure your file is processed by Agda + correctly. Code which prevents the file from compiling should be + made into comments. If you fail to solve part of a problem, you + may get more credit if you indicate clearly which part you have + not solved. + +\item \emph{Please ensure before submission that the file} + \texttt{Exam.lagda} \emph{contains your solutions to the exam.} Submit + your file using the command: + \begin{center} + \texttt{examsubmit Exam.lagda} + \end{center} + If you get an error, please check carefully that your file is called + \texttt{Exam.lagda} and that you are in the same directory as this + file. If you continue to have problems, please contact one of the + invigilators. + +Repeated submit commands are allowed, and will overwrite previous +submissions. The last file submitted will be the one marked. + +\item When the invigilators announce the end of the exam, you must + submit and log out immediately. + +\end{enumerate} + +\end{document} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/tspl/mock.pdf b/tspl/mock.pdf new file mode 100644 index 00000000..afbf55c4 Binary files /dev/null and b/tspl/mock.pdf differ diff --git a/tspl/mock.tex b/tspl/mock.tex new file mode 100644 index 00000000..33eb1306 --- /dev/null +++ b/tspl/mock.tex @@ -0,0 +1,407 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% I N F O R M A T I C S +% Honours Exam LaTeX Template for Exam Authors +% +% Created: 12-Oct-2009 by G.O.Passmore. +% Last Updated: 10-Sep-2018 by I. Murray +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% The following define the status of the exam papers in the order +%%% required. Simply remove the comment (i.e., the % symbol) just +%%% before the appropriate one and comment the others out. + +%\newcommand\status{\internal} +%\newcommand\status{\external} +\newcommand\status{\final} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% The following three lines are always required. You may add +%%% custom packages to the one already defined if necessary. + +\documentclass{examhons2018} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{semantic} +\usepackage{stix} + +%%% Uncomment the \checkmarksfalse line if the macros that check the +%%% mark totals cause problems. However, please do not make your +%%% questions add up to a non-standard number of marks without +%%% permission of the convenor. +%\checkmarksfalse + +\begin{document} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Replace {ad} below with the ITO code for your course. This will +% be used by the ITO LaTeX installation to install course-specific +% data into the exam versions it produces from this document. +% +% Your choices are (in course title order): +% +% {anlp} - Acc. Natural Language Processing (MSc) +% {aleone} - Adaptive Learning Environments 1 (Inf4) +% {adbs} - Advanced Databases (Inf4) +% {av} - Advanced Vision (Inf4) +% {av-dl} - Advanced Vision - distance learning (MSc) +% {apl} - Advances in Programming Languages (Inf4) +% {abs} - Agent Based Systems [L10] (Inf3) +% {afds} - Algorithmic Foundations of Data Science (MSc) +% {agta} - Algorithmic Game Theory and its Apps. (MSc) +% {ads} - Algorithms and Data Structures (Inf3) +% {ad} - Applied Databases (MSc) +% {aipf} - Artificial Intelligence Present and Future (MSc) +% {ar} - Automated Reasoning (Inf3) +% {asr} - Automatic Speech Recognition (Inf4) +% {bioone} - Bioinformatics 1 (MSc) +% {biotwo} - Bioinformatics 2 (MSc) +% {bdl} - Blockchains and Distributed Ledgers (Inf4) +% {cqi} - Categories and Quantum Informatics (MSc) +% {copt} - Compiler Opimisation [L11] (Inf4) +% {ct} - Compiling Techniques (Inf3) +% {ccs} - Computational Cognitive Science (Inf3) +% {cmc} - Computational Complexity (Inf4) +% {ca} - Computer Algebra (Inf4) +% {cav} - Computer Animation and Visualisation (Inf4) +% {car} - Computer Architecture (Inf3) +% {comn} - Computer Comms. and Networks (Inf3) +% {cd} - Computer Design (Inf3) +% {cg} - Computer Graphics [L11] (Inf4) +% {cn} - Computer Networking [L11] (Inf4) +% {cp} - Computer Prog. Skills and Concepts (nonhons) +% {cs} - Computer Security (Inf3) +% {dds} - Data, Design and Society (nonhons) +% {dme} - Data Mining and Exploration (Msc) +% {dbs} - Database Systems (Inf3) +% {dmr} - Decision Making in Robots and Autonomous Agents(MSc) +% {dmmr} - Discrete Maths. and Math. Reasoning (nonhons) +% {ds} - Distributed Systems [L11] (Inf4) +% {epl} - Elements of Programming Languages (Inf3) +% {es} - Embedded Software (Inf4) +% {exc} - Extreme Computing (Inf4) +% {fv} - Formal Verification (Inf4) +% {fnlp} - Foundations of Natural Language Processing (Inf3) +% {hci} - Human-Computer Interaction [L11] (Inf4) +% {infonea} - Informatics 1 - Introduction to Computation(nonhons) +% different sittings for INF1A programming exams +% {infoneapone} - Informatics 1 - Introduction to Computation(nonhons) +% {infoneaptwo} - Informatics 1 - Introduction to Computation(nonhons) +% {infoneapthree} - Informatics 1 - Introduction to Computation(nonhons) +% {infonecg} - Informatics 1 - Cognitive Science (nonhons) +% {infonecl} - Informatics 1 - Computation and Logic (nonhons) +% {infoneda} - Informatics 1 - Data and Analysis (nonhons) +% {infonefp} - Informatics 1 - Functional Programming (nonhons) +% If there are two sittings of FP, use infonefpam for the first +% paper and infonefppm for the second sitting. +% {infoneop} - Informatics 1 - Object-Oriented Programming(nonhons) +% If there are two sittings of OOP, use infoneopam for the first +% paper and infoneoppm for the second sitting. +% {inftwoa} - Informatics 2A: Proc. F&N Languages (nonhons) +% {inftwob} - Informatics 2B: Algs., D.Structs., Learning(nonhons) +% {inftwoccs}- Informatics 2C-CS: Computer Systems (nonhons) +% {inftwocse}- Informatics 2C: Software Engineering (nonhons) +% {inftwod} - Informatics 2D: Reasoning and Agents (nonhons) +% {iar} - Intelligent Autonomous Robotics (Inf4) +% {it} - Information Theory (MSc) +% {imc} - Introduction to Modern Cryptography (Inf4) +% {iotssc} - Internet of Things, Systems, Security and the Cloud (Inf4) +% (iqc) - Introduction to Quantum Computing (Inf4) +% (itcs) - Introduction to Theoretical Computer Science (Inf3) +% {ivc} - Image and Vision Computing (MSc) +% {ivr} - Introduction to Vision and Robotics (Inf3) +% {ivr-dl} - Introduction to Vision and Robotics - distance learning (Msc) +% {iaml} - Introductory Applied Machine Learning (MSc) +% {iaml-dl} - Introductory Applied Machine Learning - distance learning (MSc) +% {lpt} - Logic Programming - Theory (Inf3) +% {lpp} - Logic Programming - Programming (Inf3) +% {mlpr} - Machine Learning & Pattern Recognition (Inf4) +% {mt} - Machine Translation (Inf4) +% {mi} - Music Informatics (MSc) +% {nlu} - Natural Language Understanding [L11] (Inf4) +% {nc} - Neural Computation (MSc) +% {nat} - Natural Computing (MSc) +% {nluplus} - Natural Language Understanding, Generation, and Machine Translation(MSc) +% {nip} - Neural Information Processing (MSc) +% {os} - Operating Systems (Inf3) +% {pa} - Parallel Architectures [L11] (Inf4) +% {pdiot} - Principles and Design of IoT Systems (Inf4) +% {ppls} - Parallel Prog. Langs. and Sys. [L11] (Inf4) +% {pm} - Performance Modelling (Inf4) +% {pmr} - Probabilistic Modelling and Reasoning (MSc) +% {pi} - Professional Issues (Inf3) +% {rc} - Randomness and Computation (Inf4) +% {rl} - Reinforcement Learning (MSc) +% {rlsc} - Robot Learning and Sensorimotor Control (MSc) +% {rss} - Robotics: Science and Systems (MSc) +% {sp} - Secure Programming (Inf4) +% {sws} - Semantic Web Systems (Inf4) +% {stn} - Social and Technological Networks (Inf4) +% {sapm} - Software Arch., Proc. and Mgmt. [L11] (Inf4) +% {sdm} - Software Design and Modelling (Inf3) +% {st} - Software Testing (Inf3) +% {ttds} - Text Technologies for Data Science (Inf4) +% {tspl} - Types and Semantics for Programming Langs. (Inf4) +% {usec} - Usable Security and Privacy (Inf4) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setcourse{tspl} +\initcoursedata + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Set your exam rubric type. +% +% Most courses in the School have exams that add up to 50 marks, +% and your choices are: +% {qu1_and_either_qu2_or_qu3, any_two_of_three, do_exam} +% (which include the "CALCULATORS MAY NOT BE USED..." text), or +% {qu1_and_either_qu2_or_qu3_calc, any_two_of_three_calc, do_exam_calc} +% (which DO NOT include the "CALCULATORS MAY NOT BE USED..." text), or +% {custom}. +% +% Note, if you opt to create a custom rubric, you must: +% +% (i) **have permission** from the appropriate authority, and +% (ii) execute: +% +% \setrubrictype{} to specify the custom rubric information. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setrubric{qu1_and_either_qu2_or_qu3} + +\examtitlepage + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Manual override for total page number computation. +% +% As long as you run latex upon this document three times in a row, +% the right number of `total pages' should be computed and placed +% in the footer of all pages except the title page. +% +% But, if this fails, you can set that number yourself with the +% following command: +% +% \settotalpages{n} with n a natural number. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Beginning of your exam text. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{enumerate} + +\item \rubricqA + +\newcommand{\key}{\texttt} +\newcommand{\List}{\key{list}} +\newcommand{\nil}{\texttt{[]}} +\newcommand{\cons}{\mathbin{\key{::}}} +\newcommand{\member}{\key{member}} +\newcommand{\sublist}{\key{sublist}} + +This question uses the library definition of $\List$ in Agda. +Here is an informal definition of the predicates $\in$ +and $\subseteq$. (In Emacs, you can type $\in$ as \verb$\in$ and $\subseteq$ as \verb$\subseteq$.) +$\subseteq$ +\begin{gather*} +\inference[$\key{here}$] + {} + {x \in (x \cons xs)} +\qquad +\inference[$\key{there}$] + {x \in ys} + {x \in (y \cons ys)} +\\~\\ +\inference[$\key{done}$] + {} + {\nil \subseteq ys} +\\~\\ +\inference[$\key{keep}$] + {xs \subseteq ys} + {(x \cons xs) \subseteq (x \cons ys)} +\qquad +\inference[$\key{drop}$] + {xs \subseteq ys} + {xs \subseteq (y \cons ys)} +\end{gather*} + +\begin{itemize} + +\item[(a)] Formalise the definition above. +\marks{10} + +\item[(b)] Prove each of the following. + \begin{itemize} + \item[(i)] $\key{2} \in \key{[1,2,3]}$ + \item[(ii)] $\key{[1,3]} \subseteq \key{[1,2,3,4]}$ + \end{itemize} +\marks{5} + +\item[(c)] Prove the following. +\begin{center} +If $xs \subseteq ys$ then $z \in xs$ implies $z \in ys$ for all $z$. +\end{center} +\marks{10} + +\end{itemize} + +\newpage + +\item \rubricqB + +\newcommand{\Tree}{\texttt{Tree}} +\newcommand{\leaf}{\texttt{leaf}} +\newcommand{\branch}{\texttt{branch}} +\newcommand{\CASET}{\texttt{caseT}} +\newcommand{\caseT}[6]{\texttt{case}~#1~\texttt{[leaf}~#2~\Rightarrow~#3~\texttt{|}~#4~\texttt{branch}~#5~\Rightarrow~#6\texttt{]}} +\newcommand{\ubar}{\texttt{\underline{~}}} +\newcommand{\comma}{\,\texttt{,}\,} +\newcommand{\V}{\texttt{V}} +\newcommand{\dash}{\texttt{-}} +\newcommand{\Value}{\texttt{Value}} +\newcommand{\becomes}{\longrightarrow} +\newcommand{\subst}[3]{#1~\texttt{[}~#2~\texttt{:=}~#3~\texttt{]}} + + +You will be provided with a definition of intrinsically-typed lambda +calculus in Agda. Consider constructs satisfying the following rules, +written in extrinsically-typed style. + +Typing: +\begin{gather*} + \inference[\leaf] + {\Gamma \vdash M \typecolon A} + {\Gamma \vdash \leaf~M \typecolon \Tree~A} +\quad + \inference[\branch] + {\Gamma \vdash M \typecolon \Tree~A \\ + \Gamma \vdash N \typecolon \Tree~A} + {\Gamma \vdash M~\branch~N \typecolon \Tree~A} +\\~\\ + \inference[\CASET] + {\Gamma \vdash L \typecolon \Tree~A \\ + \Gamma \comma x \typecolon A \vdash M \typecolon B \\ + \Gamma \comma y \typecolon \Tree~A \comma z \typecolon \Tree~A \vdash N \typecolon B} + {\Gamma \vdash \caseT{L}{x}{M}{y}{z}{N} \typecolon B} +\end{gather*} + +Values: +\begin{gather*} +\inference[\V\dash\leaf] + {\Value~V} + {\Value~(\leaf~V)} +\qquad +\inference[\V\dash\branch] + {\Value~V \\ + \Value~W} + {\Value~(V~\branch~W)} +\end{gather*} + +Reduction: +\begin{gather*} +\inference[$\xi\dash\leaf$] + {M \becomes M'} + {\leaf{M} \becomes \leaf{M'}} +\\~\\ +\inference[$\xi\dash\branch_1$] + {M \becomes M'} + {M~\branch~N \becomes M'~\branch~N} +\qquad +\inference[$\xi\dash\branch_2$] + {\Value~V \\ + N \becomes N'} + {V~\branch~N \becomes V~\branch~N'} +\\~\\ +\inference[$\xi\dash\CASET$] + {L \becomes L'} + {\begin{array}{c} + \caseT{L}{x}{M}{y}{z}{N} \becomes \\ + {} \quad \caseT{L'}{x}{M}{y}{z}{N} + \end{array}} +\\~\\ +\inference[$\beta\dash\leaf$] + {\Value~V} + {\caseT{(\leaf~V)}{x}{M}{y}{z}{N} \becomes \subst{M}{x}{V}} +\\~\\ +\inference[$\beta\dash\branch$] + {\Value~V \\ + \Value~W} + {\caseT{(V~\branch~W)}{x}{M}{y}{z}{N} \becomes \subst{\subst{N}{y}{V}}{z}{W}} +\end{gather*} + +\begin{enumerate} +\item[(a)] Extend the given definition to formalise the evaluation and + typing rules, including any other required definitions. + \marks{12} + +\item[(b)] Prove progress. You will be provided with a proof of + progress for the simply-typed lambda calculus that you may + extend. + \marks{13} +\end{enumerate} + +Please delimit any code you add as follows. +\begin{verbatim} +-- begin +-- end +\end{verbatim} + +\newpage + +\item \rubricqC + +\newcommand{\Lift}{\texttt{Lift}} +\newcommand{\delay}{\texttt{delay}} +\newcommand{\force}{\texttt{force}} +\newcommand{\up}{\uparrow} +\newcommand{\dn}{\downarrow} + +You will be provided with a definition of inference for extrinsically-typed lambda +calculus in Agda. Consider constructs satisfying the following rules, +written in extrinsically-typed style that support bidirectional inference. + +Typing: +\begin{gather*} +\inference[$\delay$] + {\Gamma \vdash M \dn A} + {\Gamma \vdash \delay~M \dn \Lift~A} +\\~\\ +\inference[$\force$] + {\Gamma \vdash L \up \Lift~A} + {\Gamma \vdash \force~L \up A} +\end{gather*} + +\begin{enumerate} +\item[(a)] Extend the given definition to formalise the typing rules, +and update the definition of equality on types. + \marks{10} + +\item[(b)] Extend the code to support type inference for the new features. + \marks{15} +\end{enumerate} + +Please delimit any code you add as follows. +\begin{verbatim} +-- begin +-- end +\end{verbatim} + +\end{enumerate} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% End of your exam text. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\end{document} diff --git a/tspl/tspl.agda-lib b/tspl/tspl.agda-lib new file mode 100644 index 00000000..8c72811e --- /dev/null +++ b/tspl/tspl.agda-lib @@ -0,0 +1,3 @@ +name: tspl +depend: standard-library plfa +include: .