石運寶,鄒崇理
(湘潭大學 碧泉書院·哲學與歷史文化學院,湖南 湘潭 411105)

通俗來講,“連續”是指執行程序的過程中連續應用函數(applying functions)的操作,使得每個函數輸入在前的函數輸出的結果。舉例來說,存在兩個函數的復合,如f和g,g輸入整數n,得到函數值g(n),得到的結果作為論元輸入到函數f中,結果是f(g(n))。這里g被應用于函數f,g的連續在于將g作為論元輸入的那些函數,f是其中之一。
我們可以換個角度看待“連續”。拿上面的例子來說,通常的程序語言這樣理解:f為g(n)提供了一個語境(context)(1)由于“連續”始終缺乏一個符合直觀的解釋,所以下文用表達式的“語境”、函數的“未來”等近似表達“連續”的涵義。:
語境:f[ ]
項: g(n)
其中,項要輸入到語境中去計算出某個值,語境可以表示為一個λ-項:λx.f[x],而項g(n)則作為論元輸入到λx.f[x]中。Alain Lecomte[12]設想了一個問題可以解釋“連續”概念在程序語言中的作用。在運行程序過程中,由于某個原因,必須轉向另外一個函數。此時,改變函數有兩種辦法:一種是調整原來的函數;一種是將提升論元作為函數,把原來的函數作為論元。
就第二種方法而言,需要結合g尋找一個新函數g′,滿足:
g′(n)(λx.f[x])=λx.f[x]( g (n))
這時,之前的語境變成了運算對象,之前的項轉換成新的語境(2)注意,一般來說g與 g′不同,這里用的是轉換,即二者相關,但并非與之前的語境直接調換位置。。這樣做的好處是,如果我們想改變程序的“未來”,即連續,那么可以結合之前的項(論元)創造一個新函數。使用“連續”概念的程序被稱為“連續傳遞風格”(continuation passing style,CPS)。已有自動的技術將正常的程序或某個語法轉換成CPS。
Kelsey等[5]認為,“連續”表征了適用于計算的全部的(預先設置好的)未來(a continuation represents the entire (default) future for the computation)。從語言學角度來說,若給定一個句子“John admires Mary”,為了計算該句子的意義,主語John所指稱的值的“默認未來”是指,擁有“admiring Mary”這一性質。形式上來說,主語John的指稱j的未來是函數λx.(admires m) x;類似地,賓語Mary的指稱m的默認未來是“being admired by John”這一性質(所確定的集合),形式刻畫為函數λy.(admires y) j;動詞admire的指稱是函數λR.R m j,故動詞短語admires Mary的連續是函數λP.P j。拿“admiring Mary”這一性質來說,凡是擁有這一性質的個體都可以作為論元輸入,所以這一性質刻畫了一個集合,相當于John的擇代集(alternative-set)(3)擇代集概念由Rooth[13]最早提出,用于解決強調部分的語義,John introduced[Bill]F to Sue.表示語氣上強調“Bill”,則該表達式的語義為<λx[ introduce (j,x,s)],b>,其中被強調的部分Bill有兩個值,一個是通常的指稱,即b,還有一個強調語義值(focus semantics value),即λx[ introduce (j,x,s)]函數所表達的性質“John introduced x to Sue”,該“強調語義值”由一個擇代集組成。,就“John admires Mary”而言,John的連續已由該語境預先設置好(default),所以對于某個表達式而言其連續可以看作某個語境中預先確定好的未來所有可以替代該表達式進行輸入的那些對象所組成的集合。
通過這個例子,可以得出兩點啟發,一是(句子中)每個有意義的子表達式(subexpression)都有一個連續,二是每個表達式的連續總是相對于某個比它更大的表達式來說的。就第二點來說,當John出現在句子“John left yesterday”中時,John的指稱j的連續是λx.yesterday left x這一函數所表達的性質;在句子“Mary thought John left”中,John的指稱j的連續是λx.thought(left x)m這一函數所表達的性質;而在句子“Mary or John left”中,John的指稱j的連續是λx.(left m)∨(left x)。
值得一提的是,連續語義學有比較廣泛的應用性。Barker[7]將連續語義學應用于自然語言處理,該嘗試很好地闡釋了連續在程序和形式語義學領域的應用。應用連續語義學的動機之一,是可以為量詞轄域歧義問題提供很好的解決方案,克服之前文獻中缺乏一致性等疑難(比如主項和謂項未做到統一處理等不足)。
首先,給出一個簡單的語境自由語法(context free grammar),如圖1所示:
如圖2所示,每個語義對象(方括號中間的部分)都具有固定的類型(4)給定一個語言單位,將其置于[[.]]之中,它對應的類型放到右邊,基本思路是,左邊的屬于句法范疇或屬于該范疇的某個句法單元,右邊的屬于語義類型或該類型的載體(或者說刻畫左邊范疇的語義標簽)。:
其中,S是句子的范疇,t表示s的類型為真值。舉例來說,句子“some boy walks”,其中some為限定詞,其范疇為Det,類型為(e → t) → ((e → t) →t);boy范疇為N,對應的類型為(e → t),some和boy通過函數應用后得到的短語some boy的類型為((e → t)→t),而walks對應的范疇為VP,類型為(e → t),some boy和walks進行函數應用,即將類型為(e → t)的論元輸入到類型為((e → t)→t)的函數中,得到類型為t的“some boy walks”,即其類型指向真值。

如果要為某個語法提供連續語義學,不只是要為每個表達式找到其連續,還要提升該表達式的類型,使其成為以其連續為論元的函數(5)直觀上,提升John的類型,使其成為saw Mary的函數,可以理解為John指稱的個體具有saw Mary這一性質,即提升后的John是這樣一個函數,需要輸入saw Mary這一性質才形成一個完整的句子。。比如,上述涉及的專名、謂詞、通名的連續語義(上標c表示連續語義)為圖3:
圖3 表達式對應的連續語義
由此可知,不僅專名(上述名詞短語NP)獲得了類型提升,其余短語也獲得了類型提升,故類型提升操作變成了一個規則。
圖3提供了如何將單個表達式轉換為連續語義的規則,而仍待解決的問題是,當一個λ項被應用到另外一個λ項時如何通過CPS方式進行轉換。
令M和N是兩個λ項,類型分別是α → β和α,通過CPS轉換后分別為Mc和Nc,類型分別是((α → β) → t) → t和 (α → t) → t。如果將M應用到N,即(M N),可以視為N被置于語境M[]中,(M N)被置于空語境[ ]中。按照連續語義學的思路,整個語法都連續化了,因此,(M N)的連續語義應該將N的連續語義作用于M的連續語義,即(M N)的連續語義為:Nc(Mc[ ])。
(M N)的類型為β,(M N)的連續的類型β→ t,所以Nc(Mc[ ]),即(M N)c的類型應該是(β →t) → t)。但現在的問題是如何證明由類型為((α → β) → t) → t 的Mc和類型為 (α → t) → t的Nc可以推出類型為(β → t) → t的(M N)c。圖4給出了自然演繹式的證明:
圖4 (M N)c類型的自然演繹式的第一種推演
由此可以得出(M N)的連續語義為:
<1> (M N)c=λu.(Mcλm.(Ncλx.(u(mx))))
將該結論應用于John left,可以得出:
將最后一行的結果應用到類型為t → t恒等函數(identity function)λp.p,得:
但圖4的推演并不唯一。事實上,還存在另外一種推演,即圖5:
圖5 (M N)c類型的自然演繹式的第二種推演
因此,(M N)的連續語義存在另外一個形式:
<2> (M N)c=λu.(Ncλx.(Mcλm.(u(mx))))
兩種可能性表達了不同的賦值順序,在式<1>中,M的部分處于寬轄域(例子中的VP的語義部分),而N(例子中的VP的主語的語義部分)處于窄轄域;在式<2>中則相反,主語部分處于寬轄域,動詞短語部分處于窄轄域。雖然賦值順序對于上述例子John left來說無關緊要,但對于量化短語來說,賦值順序卻是非常重要的。鑒于兩種翻譯都有效,所以就某個句子來說存在不同的邏輯表征。因此,對于最初的語境自由語法,存在兩種不同的翻譯:
Alain Lecomte[12]介紹了兩種賦值的方法,計算科學領域的術語是“call-by-value”和“call-by-name”,從計算的角度來說,主要牽涉到λ-演算中β-化簡(6)β-化簡對應的英文是β-reduction,對應的運算為:((λx.M)n) → M[x → N],其中M[x → N],是指M中的x被替換為N。從外到內還是從內到外的兩種不同順序。比如下面的λ-表達式:
(λx.(λy·(x y)u)z)
可以給出兩種β-化簡:
第一種是從外到內(“call-by-name”):
(λx.(λy.(x y)u)z) → (λy·(z y)u) → (z u)
第二種是從內到外(“call-by-value”):
(λx.(λy.(x y)u)z) → (λx·(z u)z) → (z u)
然而,上述兩種化簡并非總會得出一致結果。首先,存在特定語境,更偏好于某種賦值或化簡;其次,在非匯聚性的系統中,兩種賦值方式會導致不同的結果。下面給出的例子會更好地解釋上述稱呼,即“call-by-name”和“call-by-value”的來源:
(λM.(M u)(λk.λy.(k y)g))
如果按照值傳遞進行化簡,則有:
上述化簡先將論元部分,即(λk.λy.(ky)g),進行化簡,計算出其值,然后將該值傳遞到M中,這就是值傳遞的思想。這種思路是說,假如想化簡(M N),則是在N賦值之后再進行,不會是未化簡就進行二者的函數應用運算。
再看另外一種化簡思路:
這種思路是說,先不化簡論元,而是整體代入,即將(λk.λy.(k y)g)代入到λM.(M u)中,去替換M,然后繼續進行化簡。這種思路先不化簡論元,而是盡量晚地化簡,即盡量晚地給論元賦值,就好像“凍結”整個論元一直到最后才“解凍”,即進行賦值運算。這樣,一般性地,在化簡(M N)過程中,論元N未被賦值便將其傳遞給M,這就是名字傳遞的思想。
針對上述兩種化簡方式,下面介紹表達式和表達式之間的函數應用所對應的“連續”分別是什么。
在連續語義學中,所有表達式都是以連續形式出現的,一個表達式,如λP.P(j),在輸入某個表達式得連續后,比如λx.left(x),便可以進行上述兩種方式的化簡了。這兩種化簡分別對應不同的連續。
按照值傳遞化簡,一個類型為α → β的函數表達式M,在連續語義學中被解釋為這樣一個表達式,先輸入類型為的α值,再吸收β類型的項的連續(該連續的類型為β→t)(7)在連續語義學中都是使用連續,所以這里要用β-類型的項的連續,但不同的是值傳遞要求先賦值。,最終輸出t,也就是說,按照值傳遞,一個類型為α → β的函數的連續的類型為:
α → ((β → t) → t)
則該函數M的連續語義為吸納這種類型的連續生成類型為t的表達式:
在值傳遞中,類型為α的表達式N的連續的類型為α → t,其連續語義與之前給出的相同:
在值傳遞中,兩個表達式的函數應用(M N)的連續語義為(8)Alain Lecomte[12]給出了值傳遞式和名字傳遞式連續語義風格翻譯的具體推演過程;下標v和n用于區別值傳遞和名字傳遞不同的化簡對應的連續語義風格翻譯。:
類似地,可以得到,在名字傳遞中,兩個表達式的函數應用(M N)的連續語義為:
由上可知,在值傳遞中,類型為α → β的表達式被解釋為這樣一個函數,該函數輸入賦過值(類型為α)的表達式,輸出某個語境中待賦值的表達式(該表達式本身需要賦類型為β的值,其類型為(β → t) → t,即從類型為β的項的連續到t的函數)。該語義解釋的連續化變成這樣一個函數,即在某個語境中需要賦類型α → β的值的表達式。所以,在值傳遞中,類型為α → β的函數的連續語義的類型為:
(α → ((β → t) → t) → t) → t)
在名字傳遞中,類型為α → β的表達式被解釋為這樣一個函數,該函數的輸入是在某個語境中需要賦類型為α的值的表達式(該值的類型為(α → t) → t,即從類型為α的項的連續到t的函數),輸出是在某個語境中待賦類型為β的值的表達式(該值的類型為(β → t) → t),即從類型為β的項的連續到t的函數)。該語義解釋的連續化變成這樣一個函數,即在某個語境中待賦值待賦類型為α → β的值的表達式。因此,在名字傳遞中,類型為α → β的函數的連續語義的類型為:
(((α → t) → t) → (β → t) → t) → t) → t
可以區分出三類對象:
① 類型為α的值,形成一個集合Vα;
② 類型為α的項的連續,形成一個集合Kα;
③ 演算形式,在某個語境中待賦α-類型的值的表達式,形成一個集合Cα。
在值傳遞中,類型為α → β的表達式被解釋為Vα到Cβ的函數,而在名字傳遞中,被解釋為Cα到Cβ的函數,其中Cα中的元素是從Kα到t的函數。
第二部分給出了構建某個語法連續化的過程,給定連續化過程后,可以用它恰當刻畫量化短語的轄域問題。首先給出全稱量詞和特稱量詞的連續語義:
從上述刻畫中只能看出二者是量化的,并且只能結合連續的表達式才能確定其意義。另外,需要注意的是,名詞短語everyone的指稱類型與連續的NP(如John、Mary)的指稱類型,即從NP的“連續”到真值的函數。量化的NP和其他NP指向同樣的語義對象,不同之處在于量化的NP受益于連續所帶來的不同賦值順序。

舉例來說,當量化短語在主語位置,如Everyone left,直接賦值得到?x.left x。一般來說,當量詞在賓語位置,如果按照通常的類型分析,量詞與名詞生成類型為<
為最后一行的推演添加恒等函數(λp.p),則:

按照連續語義進行分析,不論量化短語出現在主語還是賓語位置,都不會出現類型不匹配的問題。
以上對連續語義的分析為一個句子提供了一個合理的分析,但現在的問題是,如果有轄域歧義,該怎么處理。
事實上,在第二部分的結束部分已經粗略給出了思路,連續化語法提供了不只一種方式連續某個組合規則。就S→ NP VP來說,(NP VP)這條組合規則對應兩條翻譯規則<3>和<4>,如果沒有量詞出現,兩條連續規則推導結果是一樣的;如果有量詞出現,規則<3>和<4>會導致不同的轄域刻畫。
從計算角度來說,規則<3>和<4>對應不同的程序執行順序。Meyer等[15]指出,程序語言對表達式進行賦值可能會出現差異,差異來源于論元是從左到右被賦值還是從右到左被賦值。如果需要從左到右被賦值,選規則<3>是連續語法正確的選擇,反之則選規則<4>。
當然,處理自然語言語義時,規則<3>和<4>都可以使用,結果是導致歧義,這與自然語言量詞句本身存在結構歧義的事實相符合。
可以說,規則<3>使得VP優先于NP,所以VP中的量化成分的轄域寬于NP成分;類似地,規則<4>使得NP優先于VP,所以NP中的量化成分的轄域寬于VP成分。如果不添加額外的信息,這兩種優先級都有效,所以通過連續語義學,量化表達式的位置問題和轄域歧義問題自動得到解決。
“連續”概念及“連續變元”的引入,促使不同于經典λ-演算的λμ-演算的出現。Parigot[16]給出了λμ-演算系統(9)不同文獻記法不一樣,有的文獻是λμ-演算,而有的文獻是λμ-演算。。在λμ-演算系統中,除了正常的λ-變元,還有μ-變元,后者即刻畫連續概念的變元。就連續概念,從計算的角度來說,賦值語境的變化相當于從一個指令“跳轉到”另外一個,這就假定了不同指令被賦予不同的標簽(比如“goto”指令)或者不同的指令被賦予不同的名字。同理,從邏輯的觀點看,這相當于某公式被賦予某個名字。當一個項t被命名為α,記為:[α]t。一個被命名的公式在運算中發揮作用(become active),是通過對該名字進行μ-抽象實現的:μα·e。
在λμ-演算中,為量化表達式指派的語義表征和范疇如下:
有了上述范疇和語義標簽,像“everyone loves someone”這樣的量化歧義句在λμ-演算中得到如下兩種推演(10)這里省略所使用的諸如(β)(μ′)等化簡規則的具體內容,詳見文獻[16]和文獻[12]。:
<7> 全稱量詞寬轄域:
((λx.λy.((love y)x)μα.?x.((individual x)∧[α]x)),μα.?x.((individual x) ? [α]x))
→ ((λy.((love y)μα.?x.(((individual x)[α]x))))(μα.?x.(((individual x) ? [α]x)))
(β)
→((love(μα.?x.((individual x) ? [α]x))) μα.?x.((individual x)∧[α]x))
(β)
→(μβ.?x.((individual x) ? [β](love x)) μα.?x.((individual x)∧[α]x))
(μ′)
→μβ.?x.((individual x) ? ([β](love x)) μα.?x.((individual x)∧[α]x)))
(μ)
→?x.((individual x ) ? ((lovex)μα.?x.((individual x)∧[α]x)))
(σ)
→?x.((individual x) ? (μα.?y.((individual y)∧[α]((love x)y))))
(μ′)
→?x.((individual x) ? (?y.((individual y)∧((love x)y))))
(σ)
<8> 特稱量詞寬轄域:
((λx.λy.((love y)x)μα.?x.((individual x)∧[α]x)),μα.?x.((individual x) ? [α]x))
→ ((λy.((love y)μα.?x.((individual x)∧[α]x)))(μα.?x.((individual x) ? [α]x))
(β)
→((love(μα.?x.((individual x) ? [α]x))) μα.?x.((individual x)∧[α]x))
(β)
→(μβ.?x.((individual x)[β](love x))μα.?x.((individual x)[α]x))
(μ′)
→μα.?y.((individual y)∧ [α](μβ.?x.((individual x)∧[β](love x))y)
(μ′)
→?y.((individual y )∧ (μα.?x.((individual x) ? [β](love x))y)
(σ)
→?y.((individual y)∧(μβ.?x.((individual x) ? [β]((love x)y))))
(μ)
→?y.((individual y)∧(?x.((individual x) ? ((love x),y))))
(σ)
<7>和<8>兩種刻畫對應上面兩種轄域分析,即全稱量詞寬轄域和特稱量詞寬轄域。這種解決方案符合蒙塔古(Montague)關于自然語言語義分析的預設:每個非詞條的歧義,即不能劃歸為詞條的歧義,應該對應推演的歧義。雖然推演顯得繁瑣,但內置的“連續”思想可以統一地、組合地、面向表層結構地刻畫量化歧義句,這種解決方案具有一階系統所不具備的生成能力。
Barker[7]給出了連續語義學的其他應用,比如轄域位移(scope displacement)、轄域孤島(scope island)問題、廣義并列現象(generalized coordination)等問題的解析,限于篇幅,這里不多介紹。
本文主要介紹了連續概念的涵義、如何“連續化”某個語法,以及連續語義學的語言學運用。“連續”是非常成熟且應用非常廣的技術。借助于本文給出的語境自由語法,本文展示了連續語義學可為自然語言處理過程中遇到的諸多難題提供統一的處理方案。由于連續化過程中整體做了類型提升,故無需為特定表達式專門進行類型提升,且為量化表達式提供了在原地(in-situ)的解釋,這一點符合當代形式語法和形式語義學界面向表層結構的偏好。不足之處在于,沒有為某個有意義的語法,比如為對稱范疇語法(Symmetric categorial grammar)提供一個連續語義學示例,這值得后續繼續研究。連續語義學之“連續”讓人從名字上聯想到數學界著名的連續統問題,然而連續概念是否與該問題相關,則有待考察。