movements
[lambda.git] / topics / week15_continuation_applications.mdwn
diff --git a/topics/week15_continuation_applications.mdwn b/topics/week15_continuation_applications.mdwn
new file mode 100644 (file)
index 0000000..328b506
--- /dev/null
@@ -0,0 +1,605 @@
+<!-- λ ◊ ≠ ∃ Λ ∀ ≡ α β γ ρ ω φ ψ Ω ○ μ η δ ζ ξ ⋆ ★ • ∙ ● ⚫ 𝟎 𝟏 𝟐 𝟘 𝟙 𝟚 𝟬 𝟭 𝟮 ⇧ (U+2e17) ¢ -->
+[[!toc]]
+
+# Applications of continuations to natural language
+
+We've seen a number of applications of monads to natural language,
+including presupposition projection, binding, intensionality, and the
+dynamics of the GSV fragment.
+
+In the past couple of weeks, we've introduced continuations, first as
+a functional programming technique, then in terms of list and tree
+zippers, then as a monad.  In this lecture, we will generalize
+continuations slightly beyond a monad, and then begin to outline some
+of the applications of the generalized continuations.
+
+Many (though not all) of the applications are discussed in detail in
+Barker and Shan 2014, *Continuations in Natural Language*, OUP.
+
+To review, in terms of list zippers, the continuation of a focused
+element in the list is the front part of the list.
+
+    list zipper for the list [a;b;c;d;e;f] with focus on d:
+
+        ([c;b;a], [d;e;f])
+         -------
+     defunctionalized 
+     continuation
+
+In terms of tree zippers, the continuation is the entire context of
+the focused element--the entire rest of the tree.
+
+[drawing of a tree zipper]
+
+We explored continuations first in a list setting, then in a tree
+setting, using the doubling task as an example.
+
+    "abSd" ~~> "ababd"
+    "ab#deSfg" ~~> "abdedefg"
+
+The "S" functions like a shifty operator, and "#" functions like a reset.
+
+Although the list version of the doubling task was easy to understand
+thoroughly, the tree version was significantly more challenging.  In
+particular, it remained unclear why
+
+    "aScSe" ~~> "aacaceecaacaceecee"
+
+We'll burn through that conceptual fog today by learning more about
+how to work with continuations.
+
+The natural thing to try would have been to defunctionalize the
+continuation-based solution using a tree zipper.  But that would not
+have been easy, since the natural way to implement the doubling
+behavior of the shifty operator would have been to simply copy the
+context provided by the zipper.  This would have produced two
+uncoordinated copies of the other shifty operator, and we'd have been
+in the situation described in class of having a reduction strategy
+that never reduced the number of shifty operators below 2.  The
+limitation is that zippers by themselves don't provide a natural way
+to establish a dependency between two distant elements of a data
+structure.  (There are ways around this limitation of tree zippers,
+but they are essentially equivalent to the technique given just
+below.)
+
+Instead, we'll re-interpreting what the continuation monad was doing
+in more or less defunctionalized terms by using Quantifier Raising, a
+technique from linguistics.
+
+But first, motivating quantifier scope as a linguistic application.
+
+# The primary application of continuations to natural language: scope-taking
+We have seen that continuations allow a deeply-embedded element to
+take control over (a portion of) the entire computation that contains
+it.  In natural language semantics, this is exactly what it means for
+a scope-taking expression to take scope.
+
+    1. [Ann put a copy of [everyone]'s homeworks in her briefcase]
+
+    2. For every x, [Ann put a copy of x's homeworks in her briefcase]
+
+The sentence in (1) can be paraphrased as in (2), in which the
+quantificational DP *everyone* takes scope over the rest of the sentence.
+Even if you suspect that there could be an analysis of (2) on which
+"every student's term paper" could denote some kind of mereological
+fusion of a set of papers, it is much more difficult to be satisfied
+with a referential analysis when *every student* is replaced with 
+*no student*, or *fewer than three students*, and so on---see any
+semantics text book for abundant discussion.
+
+We can arrive at an analysis by expressing the meaning of
+quantificational DP such as *everyone* using continuations:
+
+    3. everyone = shift (\k.∀x.kx)
+
+Assuming there is an implicit reset at the top of the sentence (we'll
+explicitly address determining where there is or isn't a reset), the
+reduction rules for `shift` will apply the handler function (\k.∀x.kx)
+to the remainder of the sentence after abstracting over the position
+of the shift expression:
+
+    [Ann put a copy of [shift (\k.∀x.kx)]'s homeworks in her briefcase]
+    ~~> (\k.∀x.kx) (\v. Ann put a copy of v's homeworks in her briefcase)
+    ~~> ∀x. Ann put a copy of x's homeworks in her briefcase
+
+(To be a bit pedantic, this reduction sequence is more suitable for
+shift0 than for shift, but we're not being fussy here about subflavors
+of shifty operators.)
+
+The standard technique for handling scope-taking in linguistics is
+Quantifier Raising (QR).  As you might suppose, the rule for Quantifier
+Raising closely resembles the reduction rule for shift:
+
+    Quantifier Raising: given a sentence of the form
+
+             [... [QDP] ...],
+
+    build a new sentence of the form
+
+    [QDP (\x.[... [x] ...])].  
+
+Here, QDP is a scope-taking quantificational DP.
+
+Just to emphasize the similarity between QR and shift, we can use QR
+to provide insight into the tree version of the doubling task that
+mystified us earlier.  Here's the starting point:
+
+<!--
+\tree (. (a)((S)((d)((S)(e)))))
+-->
+
+<pre>
+  .
+__|___
+|    |
+a  __|___
+   |    |
+   S  __|__
+      |   |
+      d  _|__
+         |  |
+         S  e
+</pre>
+
+First we QR the lower shift operator, replacing it with a variable and
+abstracting over that variable.
+
+<!--
+\tree (. (S) ((\\x) ((a)((S)((d)((x)(e)))))))
+-->
+
+<pre>
+   .
+___|___
+|     |
+S  ___|___
+   |     |
+   \x  __|___
+       |    |
+       a  __|___
+          |    |
+          S  __|__
+             |   |
+             d  _|__
+                |  |
+                x  e
+</pre>
+
+Next, we QR the upper shift operator
+
+<!--
+\tree (. (S) ((\\y) ((S) ((\\x) ((a)((y)((d)((x)(e)))))))))
+-->
+
+<pre>
+   .
+___|___
+|     |
+S  ___|____
+   |      |
+   \y  ___|___
+       |     |
+       S  ___|___
+          |     |
+          \x  __|___
+              |    |
+              a  __|___
+                 |    |
+                 y  __|__
+                    |   |
+                    d  _|__
+                       |  |
+                       x  e
+</pre>
+
+We then evaluate, using the same value for the shift operator proposed before:
+
+    S = shift = \k.k(k "")
+
+It will be easiest to begin evaluating this tree with the lower shift
+operator (we get the same result if we start with the upper one).
+The relevant value for k is (\x.a(y(d(x e)))).  Then k "" is
+a(y(d(""(e)))), and k(k "") is a(y(d((a(y(d(""(e)))))(e)))).  In tree
+form:
+
+<!--
+\tree (. (S) ((\\y) ((a)((y)((d)(((a)((y)((d)(("")(e)))))(e)))))))
+-->
+
+<pre>
+   .
+___|___
+|     |
+S  ___|____
+   |      |
+   \y  ___|___
+       |     |
+       a  ___|___
+          |     |
+          y  ___|___
+             |     |
+             d  ___|___
+                |     |
+              __|___  e
+              |    |
+              a  __|___
+                 |    |
+                 y  __|___
+                    |    |
+                    d  __|__
+                       |   |
+                       ""  e
+</pre>
+
+
+Repeating the process for the upper shift operator replaces each
+occurrence of y with a copy of the whole tree.
+
+<!--
+\tree (. ((a)((((a)(("")((d)(((a)(("")((d)(("")(e)))))(e))))))((d)(((a)((((a)(("")((d)(((a)(("")((d)(("")(e)))))(e))))))((d)(("")(e)))))(e))))))
+-->
+
+<pre>
+      .
+      |
+______|______
+|           |
+a  _________|__________
+   |                  |
+   |               ___|___
+___|___            |     |
+|     |            d  ___|____
+a  ___|____           |      |
+   |      |        ___|____  e
+   ""  ___|___     |      |
+       |     |     a  ____|_____
+       d  ___|___     |        |
+          |     |     |      __|___
+       ___|___  e  ___|___   |    |
+       |     |     |     |   d  __|__
+       a  ___|___  a  ___|____  |   |
+          |     |     |      |  ""  e
+          ""  __|___  ""  ___|___
+              |    |      |     |
+              d  __|__    d  ___|___
+                 |   |       |     |
+                 ""  e    ___|___  e
+                          |     |
+                          a  ___|___
+                             |     |
+                             ""  __|___
+                                 |    |
+                                 d  __|__
+                                    |   |
+                                    ""  e
+</pre>
+
+The yield of this tree (the sequence of leaf nodes) is
+aadadeedaadadeedee, which is the expected output of the double-shifted tree.
+
+Exercise: the result is different, by the way, if the QR occurs in the
+opposite order.
+
+Three lessons:
+
+* Generalizing from one-sided, list-based continuation
+  operators to two-sided, tree-based continuation operators is a
+  dramatic increase in power and complexity.  (De Groote's dynamic
+  montague semantics continuations are the one-sided, list-based variety.)
+
+* Operators that
+  compose multiple copies of a context can be hard to understand
+  (though keep this in mind when we see the continuations-based
+  analysis of coordination, which involves context doubling).
+
+* When considering two-sided, tree-based continuation operators,
+  quantifier raising is a good tool for visualizing (defunctionalizing)
+  the computation.
+
+## Tower notation
+
+At this point, we have three ways of representing computations
+involving control operators such as shift and reset: using a CPS
+transform, lifting into a continuation monad, and by using QR.
+
+QR is the traditional system in linguistics, but it will not be
+adequate for us in general.  The reason has to do with evaluation
+order.  As we've discussed, especially with respect to the CPS
+transform, continuations allow fine-grained control over the order of
+evaluation.  One of the main empirical claims of Barker and Shan 2014
+is that natural language is sensitive to evaluation order.  Unlike
+other presentations of continuations, QR does not lend itself to
+reasoning about evaluation order, so we will need to use a different
+strategy.
+
+[Note to self: it is interesting to consider what it would take to
+reproduce the analyses giving in Barker and Shan in purely QR terms.
+Simple quantificational binding using parasitic scope should be easy,
+but how reconstruction would work is not so clear.]
+
+## Introducting the tower notation
+
+We'll present tower notation, then comment and motivate several of its
+features as we consider various applications.  For now, we'll motivate
+the tower notation by thinking about box types.  In the discussion of
+monads, we've thought of monadic types as values inside of a box.  The
+box will often contain information in addition to the core object.
+For instance, in the Reader monad, a boxed int contains an expression
+of type int as the payload, but also contains a function that
+manipulates a list of information.  It is natural to imagine
+separating a box into two regions, the payload and the hidden scratch
+space:
+
+<pre>
+    _______________               _______________            _______________ 
+    | [x->2, y->3] |             | [x->2, y->3] |          | [x->2, y->3] |
+  -------------------           ------------------        ------------------
+    |              |     ¢        |              |    =     |              |
+    |    +2        |             |     y        |          |     5        |
+    |______________|             |______________|          |______________|
+</pre>
+
+For people who are familiar with Discourse Representation Theory (Kamp
+1981, Kamp and Reyle 1993), this separation of boxes into payload and
+discourse scorekeeping will be familiar (although many details differ).
+
+The general pattern is that monadic treatments separate computation
+into an at-issue (pre-monadic) computation with a layer at which
+side-effects occur.
+
+The tower notation is a precise way of articulating continuation-based
+computations into a payload and (potentially multiple) layers of
+side-effects.  Visually, we won't keep the outer box, but we will keep
+the horizontal line dividing main effects from side-effects.
+
+Tower convention for types:
+<pre>
+                                              γ | β
+    (α -> β) -> γ can be equivalently written ----- 
+                                                α
+</pre>
+
+Read these types counter-clockwise starting at the bottom.
+
+Tower convention for values:
+<pre>
+                                           g[] 
+    \k.g[k(x)] can be equivalently written ---
+                                            x
+</pre>
+
+If \k.g[k(x)] has type (α -> β) -> γ, then k has type (α -> β).
+
+Here "g[ ]" is a *context*, that is, an expression with (exactly) one
+hole in it.  For instance, we might have g[x] = \forall x.P[x].
+
+We'll use a simply-typed system with two atomic types, DP (the type of
+individuals) and S (the type of truth values).  
+
+## LIFT (mid)
+
+Then in the spirit of monadic thinking, we'll have a way of lifting an
+arbitrary value into the tower system:
+
+                                           []   β|β
+    LIFT (x:α) = \k.kx : (α -> β) -> β ==  -- : ---
+                                           x     α
+
+Obviously, LIFT is exactly the midentity (the unit) for the continuation monad.
+Notice that LIFT requires the result type of the continuation argument
+and the result type of the overall expression to match (here, both are β).
+
+The name LIFT comes from Partee's 1987 theory of type-shifters for
+determiner phrases.  Importantly, LIFT applied to an
+individual-denoting expression yields the generalized quantifier
+proposed by Montague as the denotation for proper names:
+
+                                            []   S|S 
+    LIFT (j:DP) = \k.kj : (DP -> S) -> S == -- : ---
+                                            j    DP
+
+So if the proper name *John* denotes the individual j, LIFT(j) is the
+generalized quantifier that maps each property k of type DP -> S to true
+just in case kj is true.
+
+Crucially for the discussion here, LIFT does not apply only to DPs, as
+in Montague and Partee, but to any expression whatsoever.  For
+instance, here is LIFT applied to a lexical verb phrase:
+
+                                                        []    S|S 
+    LIFT (left:DP->S) = \k.kx : ((DP->S) -> S) -> S == ---- : ---
+                                                       left   DP
+
+Once we have expressions of type (α -> β) -> γ, we'll need to combine
+them.  We'll use the ¢ operator from the continuation monad:
+
+    g[]    γ | δ      h[]   δ | ρ    g[h[]]   γ | ρ
+    --- : -------  ¢  --- : ----- == ------ : -----
+    f     α -> β      x       α        fx       β
+
+Note that the types below the horizontal line combine just like
+functional application (i.e, f:(α->β) (x:α) = fx:β).
+
+## Not quite a monad
+
+This discussion is based on Wadler's paper `Composable continuations'.
+
+The unit and the combination rule work very much like we are used to
+from the various monads we've studied.
+
+In particular, we can easily see that the ¢ operator defined just
+above is exactly the same as the ¢ operator from the continuation monad:
+
+      ¢ (\k.g[kf]) (\k.h[kx])
+    = (\MNk.M(\m.N(\n.k(mn)))) (\k.g[kf]) (\k.h[kx])
+    ~~> \k.(\k.g[kf])(\m.(\k.h[kx])(\n.k(mn))
+    ~~> \k.g[(\k.h[kx])(\n.k(fn))
+    ~~> \k.g[h[k(fx)]]
+
+       g[h[]]
+    == ------
+         fx
+
+However, these continuations do not form an official monad.
+One way to see this is to consider the type of the bind operator.
+The type of the bind operator in a genuine monad is
+
+    mbind : Mα -> (α -> Mβ) -> Mβ
+
+In particular, the result type of the second argument (Mβ) must be
+identical to the result type of the bind operator overall.  For the
+continuation monad, this means that mbind has the following type:
+
+                     ((α -> γ) -> ρ)
+             -> α -> ((β -> δ) -> ρ)
+                  -> ((β -> δ) -> ρ)
+
+But the type of the bind operator in our generalized continuation
+system (call it "kbind") is
+
+    kbind : 
+                     ((α -> γ) -> ρ)
+             -> α -> ((β -> δ) -> γ)
+                  -> ((β -> δ) -> ρ)
+
+Note that `(β -> δ) -> γ` is not the same as `(β -> δ) -> ρ`.
+
+These more general types work out fine when plugged into the
+continuation monad's bind operator:
+
+    kbind u f = \k.   u           (\x.     f              x    k      )
+                 β->δ (α->γ)->ρ     α      α->(β->δ)->γ   α    β->δ
+                                           -----------------
+                                              (β->δ)->γ
+                                              ------------------------
+                                                      γ
+                                   --------------------
+                                        α->γ
+                       ---------------------
+                              ρ
+                ---------------
+                   (β->δ)->ρ
+
+Neverthless, it's easy to see that the generalized continuation system
+obeys the monad laws.  We haven't spent much time proving monad laws,
+so this seems like a worthy occasion on which to give some details.
+Since we're working with bind here, we'll use the version of the monad
+laws that are expressed in terms of bind:
+
+    Prove u >>= ⇧ == u:
+
+       u >>= (\ak.ka)
+    == (\ufk.u(\x.fxk)) u (\ak.ka)
+    ~~> \k.u(\x.(\ak.ka)xk)
+    ~~> \k.u(\x.kx)
+    ~~> \k.uk
+    ~~> u
+
+The last two steps are eta reductions.
+
+    Prove ⇧a >>= f == f a:
+
+       ⇧a >>= f
+    == (\ak.ka)a >>= f
+    ~~> (\k.ka) >>= f
+    == (\ufk.u(\x.fxk)) (\k.ka) f
+    ~~> \k.(\k.ka)(\x.fxk)
+    ~~> \k.fak
+    ~~> fa
+
+    Prove u >>= (\a.fa >>= g) == (u >>= f) >>= g:
+        
+       u >>= (\a.fa >>= g)
+    == u >>= (\a.(\k.fa(\x.gxk)))
+    == (\ufk.u(\x.fxk)) u (\a.(\k.fa(\x.gxk)))
+    == \k.u(\x.(\a.(\k.fa(\x.gxk)))xk)
+    ~~> \k.u(\x.fx(\y.gyk))
+
+       (u >>= f) >>= g
+    == (\ufk.u(\x.fxk)) u f >>= g
+    ~~> (\k.u(\x.fxk)) >>= g
+    == (\ufk.u(\x.fxk)) (\k.u(\x.fxk)) g
+    ~~> \k.(\k.u(\x.fxk))(\y.gyk)
+    ~~> \k.u(\x.fx(\y.gyk))
+
+The fact that the monad laws hold means that we can rely on any
+reasoning that depends on the monad laws.
+
+## Syntactic refinements: subtypes of implication
+
+Because natural language allows the functor to be on the left or on
+the right, we replace the type arrow -> with a left-leaning version \
+and a right-leaning version, as follows:
+
+    α/β   β    = α
+      β   β\α  = α
+
+This means (without adding some fancy footwork, as in Charlow 2014) we
+need two versions of ¢ too, one for each direction for the unmonadized types.
+
+Just to be explicit, here are the two versions:
+
+    g[]    γ | δ      h[]   δ | ρ    g[h[]]   γ | ρ
+    --- : -------  ¢  --- : ----- == ------ : -----
+    f       α/β        x       α        fx       β
+
+    h[]   δ | ρ      g[]    γ | δ       g[h[]]   γ | ρ
+    --- : -----  ¢   --- : -------   == ------ : -----
+     x      α         f      β\α          fx       β
+
+With respect to types, they differ only in replacing α -> β with α/β
+(top version) and with β\α (bottom version).  With respect to
+syntactic order, they differ in a parallel way with respect to whether
+the function f is on the left of its argument x (top version) or on
+the right (bottom version).
+
+Logically, separating -> into \\ and / corresponds to rejecting the
+structural rule of exchange.
+
+Note that the \\ and / only govern types at the bottom of the tower.
+That is, we currently still have arrow at the higher-order levels of
+the types, if we undo the tower notation:
+
+    γ|δ
+    --- == ((α/β) -> δ) -> γ
+    α/β
+
+We'll change these arrows into left-leaning and right-leaning versions
+too, according to the following scheme:
+
+    γ|δ
+    --- == γ//((α/β) \\ δ)
+    α/β
+
+As we'll see in a minute, each of these for implications (\\, /, \\\\,
+//) will have a syntactic interpretation:
+
+    \   argument is adjacent on the left of the functor
+    /    argument is adjacent on the right of the functor
+    \\   argument is surrounded by the functor
+    //  argument surrounds the functor
+
+## LOWER (reset)
+
+One more ingredient: one thing that shifty continuation operators
+require is an upper bound, a reset to show the extent of the remainder
+of the computation that the shift operator captures.  In the list
+version of the doubling task, we have
+
+    "a#bdeSfg" ~~> "abdebdefg"   continuation captured: bde
+    "ab#deSfg" ~~> "abdedefg"    continuation captured:  de
+
+In programming languages, resets are encoded in the computation
+explicitly.  In natural language, resets are always invisible.
+We'll deal with this in the natural language setting by allowing
+spontaneous resets, as long as the types match the following recipe:
+
+           g[] α|S
+    LOWER (---:---) == g[p]:α
+            p   S
+
+This will be easiest to explain by presenting our first complete
+example from natural language:
+
+