Skip to content
Documentation out of dateLearn more

POPL Tutorial/Pattern matching

This is a case study on pattern matching using STELF.

%sort nat %.
%term z nat %.
%term s %pi nat %-> nat %.
%sort tp %.
%term o tp %.
%term arrow %pi tp %-> tp %-> tp %.
%term prod %pi tp %-> tp %-> tp %.
%term sum %pi tp %-> tp %-> tp %.
%sort tplist %.
%term tplist/nil tplist %.
%term tplist/cons %pi tp %-> tplist %-> tplist %.
%sort pat %.
%term pat/underscore pat %.
%term pat/pair %pi pat %-> pat %-> pat %.
%term pat/inl %pi pat %-> pat %.
%term pat/inr %pi pat %-> pat %.
%term pat/var pat %.
%term pat/as %pi pat %-> pat %-> pat %.
%sort exp %.
%sort oexp %.
% oexp N is an expression with N bound vars
%sort match %.
%term exp/unit exp %.
%term exp/lam %pi match %-> exp %.
%term exp/app %pi exp %-> exp %-> exp %.
%term exp/pair %pi exp %-> exp %-> exp %.
%term exp/inl %pi exp %-> exp %.
%term exp/inr %pi exp %-> exp %.
%term exp/handle %pi exp %-> exp %-> exp %.
%term oexp/c %pi exp %-> oexp %.
%term oexp/o %pi (%pi exp %-> oexp) %-> oexp %.
%term match/nil match %.
%term match/cons %pi pat %-> oexp %-> match %-> match %.

static semantics

%sort tplist-append {_ tplist} {_ tplist} {_ tplist} %.
%term tplist-append/nil tplist-append tplist/nil TL TL %.
%term tplist-append/cons
%pi (tplist-append (tplist/cons T TL) TL' (tplist/cons T TL''))
%<- (tplist-append TL TL' TL'') %.
%sort tplist-get {_ nat} {_ tplist} {_ tp} %.
%term tplist-get/hit tplist-get z (tplist/cons T TL) T %.
%term tplist-get/miss %pi (tplist-get (s N) (tplist/cons T TL) T') %<- (tplist-get N TL T') %.
%sort of-pat {_ pat} {_ tp} {_ tplist} %.
%term of-pat/underscore of-pat pat/underscore T tplist/nil %.
%term of-pat/pair
%pi (of-pat (pat/pair P1 P2) (prod T1 T2) TL')
%<- (of-pat P1 T1 TL1)
%<- (of-pat P2 T2 TL2)
%<- (tplist-append TL1 TL2 TL') %.
%term of-pat/inl %pi (of-pat (pat/inl P) (sum T1 T2) TL) %<- (of-pat P T1 TL) %.
%term of-pat/inr %pi (of-pat (pat/inr P) (sum T1 T2) TL) %<- (of-pat P T2 TL) %.
%term of-pat/var of-pat pat/var T (tplist/cons T tplist/nil) %.
%term of-pat/as
%pi (of-pat (pat/as P1 P2) T TL3)
%<- (of-pat P1 T TL1)
%<- (of-pat P2 T TL2)
%<- (tplist-append TL1 TL2 TL3) %.
%sort of-exp {_ exp} {_ tp} %.
%sort of-match {_ match} {_ tp} {_ tp} %.
%sort of-oexp {_ tplist} {_ oexp} {_ tp} %.
%term of-oexp/c %pi (of-oexp tplist/nil (oexp/c E) T) %<- (of-exp E T) %.
%term of-oexp/o
%pi (of-oexp (tplist/cons T TL) (oexp/o ([x] EL x)) T')
%<- ({x} %pi (of-exp x T) %-> (of-oexp TL (EL x) T')) %.
%term of-match/nil of-match match/nil T T' %.
%term of-match/cons
%pi (of-match (match/cons P OE M) T T')
%<- (of-pat P T TL)
%<- (of-oexp TL OE T')
%<- (of-match M T T') %.
%term of-exp/unit of-exp exp/unit o %.
%term of-exp/lam %pi (of-exp (exp/lam M) (arrow T1 T2)) %<- (of-match M T1 T2) %.
%term of-exp/app %pi (of-exp (exp/app E1 E2) T2) %<- (of-exp E1 (arrow T1 T2)) %<- (of-exp E2 T1) %.
%term of-exp/pair %pi (of-exp (exp/pair E1 E2) (prod T1 T2)) %<- (of-exp E1 T1) %<- (of-exp E2 T2) %.
%term of-exp/inl %pi (of-exp (exp/inl E) (sum T1 T2)) %<- (of-exp E T1) %.
%term of-exp/inr %pi (of-exp (exp/inr E) (sum T1 T2)) %<- (of-exp E T2) %.
%term of-exp/handle %pi (of-exp (exp/handle E1 E2) T) %<- (of-exp E1 T) %<- (of-exp E2 T) %.
% syntax only needed for dynamic semantics of the language
%sort explist %.
%term explist/nil explist %.
%term explist/cons %pi exp %-> explist %-> explist %.
% static semantics of explists
%sort of-explist {_ explist} {_ tplist} %.
%term of-explist/nil of-explist explist/nil tplist/nil %.
%term of-explist/cons
%pi (of-explist (explist/cons E EL) (tplist/cons T TL))
%<- (of-exp E T)
%<- (of-explist EL TL) %.
%sort subst-oexp {_ explist} {_ oexp} {_ exp} %.
%term subst-oexp/c subst-oexp explist/nil (oexp/c E) E %.
%term subst-oexp/o
%pi (subst-oexp (explist/cons E EL) (oexp/o ([x] OE x)) E')
%<- (subst-oexp EL (OE E) E') %.
%sort explist-get {_ nat} {_ explist} {_ exp} %.
%term explist-get/hit explist-get z (explist/cons T TL) T %.
%term explist-get/miss %pi (explist-get (s N) (explist/cons T TL) T') %<- (explist-get N TL T') %.
%sort explist-append {_ explist} {_ explist} {_ explist} %.
%term explist-append/nil explist-append explist/nil EL EL %.
%term explist-append/cons
%pi (explist-append (explist/cons E EL) EL' (explist/cons E EL''))
%<- (explist-append EL EL' EL'') %.
%sort apply-pat {_ pat} {_ exp} {_ explist} %.
% only have to define failure over well-typed pattern/expression pairs
% failures arise from inl/inr mismatches
%sort fail-pat {_ pat} {_ exp} %.
%term apply-pat/underscore apply-pat pat/underscore E explist/nil %.
%term apply-pat/pair
%pi (apply-pat (pat/pair P1 P2) (exp/pair E1 E2) EL')
%<- (apply-pat P1 E1 EL1)
%<- (apply-pat P2 E2 EL2)
%<- (explist-append EL1 EL2 EL') %.
%term apply-pat/inl %pi (apply-pat (pat/inl P) (exp/inl E) EL) %<- (apply-pat P E EL) %.
%term apply-pat/inr %pi (apply-pat (pat/inr P) (exp/inr E) EL) %<- (apply-pat P E EL) %.
%term apply-pat/var apply-pat pat/var E (explist/cons E explist/nil) %.
%term apply-pat/as
%pi (apply-pat (pat/as P1 P2) E EL')
%<- (apply-pat P1 E EL1)
%<- (apply-pat P2 E EL2)
%<- (explist-append EL1 EL2 EL') %.
%term fail-pat/pair-1 %pi (fail-pat (pat/pair P1 P2) (exp/pair E1 E2)) %<- (fail-pat P1 E1) %.
%term fail-pat/pair-2
%pi (fail-pat (pat/pair P1 P2) (exp/pair E1 E2))
%<- (apply-pat P1 E1 EL)
%<- (fail-pat P2 E2) %.
%term fail-pat/inl-t %pi (fail-pat (pat/inl P) (exp/inl E)) %<- (fail-pat P E) %.
%term fail-pat/inl-f fail-pat (pat/inl P) (exp/inr E) %.
%term fail-pat/inr-t %pi (fail-pat (pat/inr P) (exp/inr E)) %<- (fail-pat P E) %.
%term fail-pat/inr-f fail-pat (pat/inr P) (exp/inl E) %.
%term fail-pat/as-1 %pi (fail-pat (pat/as P1 P2) E) %<- (fail-pat P1 E) %.
%term fail-pat/as-2 %pi (fail-pat (pat/as P1 P2) E) %<- (apply-pat P1 E EL) %<- (fail-pat P2 E) %.
%sort apply-or-fail-pat {_ pat} {_ exp} %.
%term apply-or-fail-pat/apply %pi (apply-or-fail-pat P E) %<- (apply-pat P E EL) %.
%term apply-or-fail-pat/fail %pi (apply-or-fail-pat P E) %<- (fail-pat P E) %.
%sort apply-match {_ match} {_ exp} {_ exp} %.
%term apply-match/cons-1
%pi (apply-match (match/cons P OE M) E E')
%<- (apply-pat P E EL)
%<- (subst-oexp EL OE E') %.
%term apply-match/cons-2
%pi (apply-match (match/cons P OE M) E E')
%<- (fail-pat P E)
%<- (apply-match M E E') %.
%sort fail-match {_ match} {_ exp} %.
%term fail-match/nil fail-match match/nil E %.
%term fail-match/cons %pi (fail-match (match/cons P OE M) E) %<- (fail-pat P E) %<- (fail-match M E) %.
%sort apply-or-fail-match {_ match} {_ exp} %.
%term apply-or-fail-match/apply %pi (apply-or-fail-match M E) %<- (apply-match M E E') %.
%term apply-or-fail-match/fail %pi (apply-or-fail-match M E) %<- (fail-match M E) %.
%sort exception %.
%term exception/match exception %.
%sort value {_ exp} %.
%term value/unit value exp/unit %.
%term value/lam value (exp/lam M) %.
%term value/pair %pi (value (exp/pair E1 E2)) %<- (value E1) %<- (value E2) %.
%term value/inl %pi (value (exp/inl E)) %<- (value E) %.
%term value/inr %pi (value (exp/inr E)) %<- (value E) %.
%sort raises {_ exp} {_ exception} %.
%term raises/app-1 %pi (raises (exp/app E1 E2) X) %<- (raises E1 X) %.
%term raises/app-2 %pi (raises (exp/app E1 E2) X) %<- (value E1) %<- (raises E2 X) %.
%term raises/app-fail
%pi (raises (exp/app (exp/lam M) E2) exception/match)
%<- (value E2)
%<- (fail-match M E2) %.
%term raises/pair-1 %pi (raises (exp/pair E1 E2) X) %<- (raises E1 X) %.
%term raises/pair-2 %pi (raises (exp/pair E1 E2) X) %<- (value E1) %<- (raises E2 X) %.
%term raises/inl %pi (raises (exp/inl E) X) %<- (raises E X) %.
%term raises/inr %pi (raises (exp/inr E) X) %<- (raises E X) %.
%sort step {_ exp} {_ exp} %.
%term step/app-1 %pi (step (exp/app E1 E2) (exp/app E1' E2)) %<- (step E1 E1') %.
%term step/app-2 %pi (step (exp/app E1 E2) (exp/app E1 E2')) %<- (value E1) %<- (step E2 E2') %.
%term step/app-beta %pi (step (exp/app (exp/lam M) E) E') %<- (value E2) %<- (apply-match M E E') %.
%term step/pair-1 %pi (step (exp/pair E1 E2) (exp/pair E1' E2)) %<- (step E1 E1') %.
%term step/pair-2 %pi (step (exp/pair E1 E2) (exp/pair E1 E2')) %<- (value E1) %<- (step E2 E2') %.
%term step/inl %pi (step (exp/inl E) (exp/inl E')) %<- (step E E') %.
%term step/inr %pi (step (exp/inr E) (exp/inr E')) %<- (step E E') %.
%term step/handle %pi (step (exp/handle E1 E2) (exp/handle E1' E2)) %<- (step E1 E1') %.
%term step/handle-beta %pi (step (exp/handle E1 E2) E1) %<- (value E1) %.
%term step/handle-fail %pi (step (exp/handle E1 E2) E2) %<- (raises E1 X) %.
%sort preservation-subst-oexp {_ of-explist EL TL} {_ of-oexp TL OE T} {_ subst-oexp EL OE E} {_ of-exp E T} %.
%mode preservation-subst-oexp %in %in %in %out %.
%term _ preservation-subst-oexp _ (of-oexp/c D1) subst-oexp/c D1 %.
%term _
%pi (preservation-subst-oexp (of-explist/cons D1 D) (of-oexp/o D2) (subst-oexp/o D3) D4)
%<- (preservation-subst-oexp D1 (D2 _ D) D3 D4) %.
%worlds () (preservation-subst-oexp _ _ _ _) %.
%total (D1) (preservation-subst-oexp _ _ D1 _) %.
%sort preservation-append {_ of-explist EL1 TL1} {_ of-explist EL2 TL2} {_ explist-append EL1 EL2 EL3} {_ tplist-append TL1 TL2 TL3} {_ of-explist EL3 TL3} %.
%mode preservation-append %in %in %in %in %out %.
%term _ preservation-append _ D explist-append/nil tplist-append/nil D %.
%term _
%pi (preservation-append (of-explist/cons D1 D) D2 (explist-append/cons D3) (tplist-append/cons D4) (of-explist/cons D5 D))
%<- (preservation-append D1 D2 D3 D4 D5) %.
%worlds () (preservation-append _ _ _ _ _) %.
%total (D1) (preservation-append _ _ _ D1 _) %.
%sort preservation-get {_ of-explist EL TL} {_ explist-get M EL E} {_ tplist-get M TL T} {_ of-exp E T} %.
%mode preservation-get %in %in %in %out %.
%term _ preservation-get (of-explist/cons _ D) explist-get/hit tplist-get/hit D %.
%term _
%pi (preservation-get (of-explist/cons DL _) (explist-get/miss D') (tplist-get/miss D'') D)
%<- (preservation-get DL D' D'' D) %.
%worlds () (preservation-get _ _ _ _) %.
%total (D1) (preservation-get _ _ D1 _) %.
%sort preservation-apply-pat {_ of-exp E T} {_ of-pat P T TL} {_ apply-pat P E EL} {_ of-explist EL TL} %.
%mode preservation-apply-pat %in %in %in %out %.
%term _ preservation-apply-pat D1 of-pat/underscore apply-pat/underscore of-explist/nil %.
%term _
%pi (preservation-apply-pat (of-exp/pair DE2 DE1) (of-pat/pair DTA DP2 DP1) (apply-pat/pair DEA DA2 DA1) D3)
%<- (preservation-apply-pat DE1 DP1 DA1 D1)
%<- (preservation-apply-pat DE2 DP2 DA2 D2)
%<- (preservation-append D1 D2 DEA DTA D3) %.
%term _
%pi (preservation-apply-pat DE (of-pat/as DTA DP2 DP1) (apply-pat/as DEA DA2 DA1) D3)
%<- (preservation-apply-pat DE DP1 DA1 D1)
%<- (preservation-apply-pat DE DP2 DA2 D2)
%<- (preservation-append D1 D2 DEA DTA D3) %.
%term _
%pi (preservation-apply-pat (of-exp/inl DE) (of-pat/inl DP) (apply-pat/inl DA) D)
%<- (preservation-apply-pat DE DP DA D) %.
%term _
%pi (preservation-apply-pat (of-exp/inr DE) (of-pat/inr DP) (apply-pat/inr DA) D)
%<- (preservation-apply-pat DE DP DA D) %.
%term _ preservation-apply-pat D1 of-pat/var apply-pat/var (of-explist/cons of-explist/nil D1) %.
%worlds () (preservation-apply-pat _ _ _ _) %.
%total (D1) (preservation-apply-pat _ _ D1 _) %.
%sort preservation-apply-match {_ of-exp E T} {_ of-match M T T'} {_ apply-match M E E'} {_ of-exp E' T'} %.
%mode preservation-apply-match %in %in %in %out %.
%term _
%pi (preservation-apply-match D1 (of-match/cons _ DOE D2) (apply-match/cons-1 DS DA) D')
%<- (preservation-apply-pat D1 D2 DA D)
%<- (preservation-subst-oexp D DOE DS D') %.
%term _
%pi (preservation-apply-match D1 (of-match/cons D2 _ _) (apply-match/cons-2 DA _) D')
%<- (preservation-apply-match D1 D2 DA D') %.
%worlds () (preservation-apply-match _ _ _ _) %.
%total (D1) (preservation-apply-match _ _ D1 _) %.
%sort preservation {_ of-exp E T} {_ step E E'} {_ of-exp E' T} %.
%mode preservation %in %in %out %.
%term _
%pi (preservation (of-exp/app D2 D1) (step/app-1 DS) (of-exp/app D2 D1'))
%<- (preservation D1 DS D1') %.
%term _
%pi (preservation (of-exp/app D2 D1) (step/app-2 DS V) (of-exp/app D2' D1))
%<- (preservation D2 DS D2') %.
%term _
%pi (preservation (of-exp/app D2 (of-exp/lam D1)) (step/app-beta DA _) D)
%<- (preservation-apply-match D2 D1 DA D) %.
%term _
%pi (preservation (of-exp/pair D2 D1) (step/pair-1 DS) (of-exp/pair D2 D1'))
%<- (preservation D1 DS D1') %.
%term _
%pi (preservation (of-exp/pair D2 D1) (step/pair-2 DS V) (of-exp/pair D2' D1))
%<- (preservation D2 DS D2') %.
%term _
%pi (preservation (of-exp/handle D2 D1) (step/handle DS) (of-exp/handle D2 D1'))
%<- (preservation D1 DS D1') %.
%term _
%pi (preservation (of-exp/inl D1) (step/inl DS) (of-exp/inl D1'))
%<- (preservation D1 DS D1') %.
%term _
%pi (preservation (of-exp/inr D1) (step/inr DS) (of-exp/inr D1'))
%<- (preservation D1 DS D1') %.
%term _
%pi (preservation (of-exp/handle D2 D1) (step/handle DS) (of-exp/handle D2 D1'))
%<- (preservation D1 DS D1') %.
%term _ preservation (of-exp/handle D2 D1) (step/handle-beta _) D1 %.
%term _ preservation (of-exp/handle D2 D1) (step/handle-fail _) D2 %.
%worlds () (preservation _ _ _) %.
%total (D1) (preservation _ D1 _) %.

—DanielKLee 01:46, 11 October 2007 (EDT)

TODO: Finish commentary.