能用數學歸納法做證明題的 Wolfram|Alpha

世界第一個不受語法束縛的基於數學歸納法的Proof Generator於2016年在 Wolfram|Alpha上閃亮登場,它的設計和創建離不開創意、行動力和優秀資源的整合。

創作動機

Wolfram | Alpha是學生們尤其是大一學生學習數學課程常用的工具。 事實上,當我向學生們解釋我在Wolfram | Alpha的工作時,從他們那裏得到的最常見的一個回答就是:"OMG,這個網站是我學習微積分的救命稻草。"他們通常是在說微分方程求解器,或Wolfram | Alpha的導數和積分功能。

高中和大學一年級所學的大部分數學知識以計算爲基礎,題型與上面提到的這些功能類似。試題經常以下列形式出現:

  • 求 x
  • 求 f(x)的導數
  • 求下列方程的根

計算型問題通常涉及一系列計算 (即步驟) 以獲得最終結果。可以通過計算解決的問題使用的方法往往是重複的。一旦學生掌握了與這類問題相關的步驟和規則,基本就能夠解決作業或考試中出現的與這類問題相關的任何問題。這是因爲基於計算的問題有一套循規蹈矩的方法。與學習函數的導數類似,一旦學生掌握了"求導規則",解決這些問題不過就是反覆應用這些規則而已。

那麼,問題來了,對於那些與計算無關的數學問題呢? 更具體地說,對於沒有什麼規則或方法的數學問題,學生該如何學習和練習?當我還是一個學習離散數學的一年級學生時,我遇到了這個問題。 學習的是數學歸納原理的證明,我將在後面簡要介紹一下背景。 這個內容與我以前在數學課上學到的任何知識都不同,原因有兩個:

  • 證明不是計算。 一套規則不能適用於所有問題。
  • 證明沒有一個唯一正確的最終答案。

數學問題沒有一個簡單、明確的答案是很奇怪的想法。 如果一個學生在測試中解方程,他們可能會寫上五行步驟,然後最後寫上最終答案,比方說以"x = 21"的形式。 然而,數學證明並不是那樣的。 事實上,步驟本身就是"答案"。 證明的目的是邏輯地說明爲什麼某些論斷是真的。

假設你正在玩謀殺懸疑圖版遊戲Clue(或Cluedo,中文名稱"妙探尋兇")。遊戲的目標是確定兇手是誰,使用的武器以及犯罪地點。如果誰說出這樣一句話:"Mustard上校拿左輪手槍在餐廳。"他就贏了。現在想象一下,不是試圖找出這些信息,而是在遊戲開始時就告訴你兇手是誰,使用什麼武器,以及犯罪地點。現在的目標不是確定結論(因爲你已經被告知),而是搞清楚爲什麼這是真的。根據你自己的卡片和遊戲過程中暴露的信息,最終應該能夠使用邏輯證明爲什麼在遊戲開始時被告知的信息一定是真實的。這樣,你可以通過陳述某些內容來在遊戲中獲勝,"因爲我手裏有除了左輪手槍之外所有的兇器卡,而且Joe有除了餐廳之外所有的位置卡,而且根據你們出過的牌,我知道你們手上都沒有那張Mustard上校,所以我證明了所指控的兇手是真的。"

我並不想說明上面這個Clue遊戲的變形有多好玩,實際上正好相反,它變得一點意思都沒有了。我講它的目的是想說明證明所表示的問/答格式。下面是一道一年級學生可能會在考試中遇到的歸納法證明題:

用數學歸納法證明:對於 n > 0,8^n - 3^n均能被5整除。

當n > 0時,8^n - 3^n能被5整除這個推斷是完全成立的(假定n爲整數)。但這裏是讓學生從邏輯上證明這個結論成立。就像上例中對遊戲Clue的變形一樣,信息在遊戲開始就告訴了你, 然後要證明它是真的。對大多數學生來說, 寫出這些證明並不簡單,而且往往是最難掌握的數學概念之一。

鑑於這些問題的複雜性,學生們常常求助於互聯網資源(如Wolfram|Alpha)。如果學生需要求解一道微分方程,並希望驗證答案,他可以將問題交給Wolfram|Alpha,Wolfram|Alpha不僅會給出最終答案,還會給出求解過程。這同樣適用於求導、積分、化簡表達式等等。但證明題呢?

我們已經確定,證明題不同於計算題。據我所知, 至今沒有任何計算器或在線工具能夠爲證明問題提供解決方案。

我清楚地記得一年級的時候, 我想檢驗作業題中一道證明題的解。我已經寫出了自認爲正確的解。但怎麼檢驗我的答案是否正確?令人驚訝的是, 只有兩種方法可以驗證我的證明的正確性:

  • 找到與在線示例完全相同的證明(非常罕見)
  • 與班上其他同學的答案比較,假定如果我們的答案相同,則我們一定都正確 (錯誤假設)

那麼爲什麼在線"導數計算器"很容易找到,而"證明計算器"卻如此困難呢?

主要是由於這一事實——證明通常被視爲是不可計算的。由於同一組規則不能用於覆蓋100% 的證明,計算機難以創建證明所組成的邏輯步驟。我解決這個問題的方法是,建立一個與模式匹配的證據庫 (如下所述)。這種方法證明了計算在構造證明中起着作用, 一個可行的 "證明生成器" 應運而生。

原型

在一個夏天, 我開始建立一個應用程序原型, 它能夠使用數學歸納原理 (PMI)執行有限數量的證明。PMI 是證明一個命題是否成立的常用方法,把這個方法想成一列很長的的多米諾骨牌也許更容易理解一些。首先, 你要證明, 第一個多米諾骨牌會倒。第二, 你要證明,只要任意一張骨牌倒了,那麼與其相鄰的下一張骨牌也會倒。通過證明這兩個事實, 你就可以證明, 如果第一個被推倒, 所有的多米諾骨牌都會倒下。

多米諾骨牌的例子很好地說明了歸納證明背後的邏輯,有兩步組成:

  • 起始步驟(第一張多米諾) :驗證命題在起始時成立(n取最小值),也就是說,如果要證明某個命題在n >= 1時成立,起始步驟就要證明命題在n = 1時成立。
  • 歸納步驟(後續的多米諾):這是更具挑戰性的一步。在歸納步驟中, 假設命題對於某個值 (即 k) 成立,然後嘗試證明對於 k + 1 亦成立。

如果這兩個步驟都正確完成, 則證明完成。

在開發這個應用程序之前,我曾與我本科時的一位大學 (阿爾戈馬大學) 教授探討。他將這一具有挑戰性的想法比作製作一本包含世界上所有食譜的食譜書。你可以不斷添加儘可能多的食譜,但它基本上不可能包括曾經出現過的所有食譜。同樣, 我可以不斷提高證明題的覆蓋率,但我永遠不能將每個用戶將要求的證明囊括。

雖然有相當明顯的侷限性, 但我換了一個考慮問題的角度。我想,如果一個烹飪新手想要一本食譜, 它可能會是一個相當厚的食譜。他們可能想嘗試各種各樣的食譜。同時, 他們不太可能想把Gordon Ramsay的名菜Beef Wellington列入食譜。準備那道菜的難度對於一個烹飪新手來說可能太高了。同樣道理,對於學習證明 (大學一年級) 的新生來說, 他們很可能不需要訪問太過高深的證明資源。只要他們的資源可以應付一年級的證明題, 那麼在他們看來資源就足夠充分了。這是我在研發規劃階段作出的重要區分。

在原型開發過程中, 我很快就遇到一個迫在眉睫的挑戰。我理想的應用程序能夠對付的許多證明都涉及到簡化表達式, 這本身就是一個非常複雜的程序。這時,我第一次發現了Wolfram|Alpha的API。使用其 API,我可以簡單地直接調用Wolfram |Alpha (即化簡表達式), 並將結果返回到我的應用程序。我使用 API時遇到幾個具體的問題, 所以我決定直接聯繫Wolfram|Alpha。

電話那頭的工作人員很快回答了我的問題,然後話題轉到了我沒想到的方向。在我解釋了正在構建的小應用項目之後, 他讓我把這個應用向Wolfram|Alpha的另外幾位成員演示(當然事先簽署了保密協議)。當時,這個應用程序能夠處理的證明還相當有限,但作爲一個原型或概念的證明表現還是相當不錯的。演示進行得很順利, 但再一次,談話的方向讓我始料不及。幾個星期後,我收到了Wolfram|Alpha的職位聘書,作爲數學內容開發人員,我接受了。

工作原理

我在第二個夏天,搬到了伊利諾伊州香檳,Wolfram|Alpha的總部。在這裏, 我參與了在網站上添加數學功能的幾個項目。但我的主要精力還是重新實現我的歸納證明計劃,使其成爲Wolfram|Alpha的一部分。

這個項目的目標是解決學生在一年級課程中遇到的任何歸納證明問題。爲了使這成爲現實, 我搜遍了互聯網和教科書, 尋找所有的歸納證明問題。

需要解釋一下的是,這個項目並不是我能找到的所有歸納問題的數據庫。爲了使程序能夠適用於所有證明 (甚至是它以前沒有見過的),我首先需要歸納學生正在學習的歸納證明題型。早期的決定是, 該程序將處理三種主要類型的證明:

  • 求和/乘積等式,如:證明 1 + 2 + 3 +\[Ellipsis] + n = n(n + 1)/2, 其中 n > 0
  • 表達式整除性,如:證明8^n \[Dash] 3^n能被5整除,其中 n > 0
  • 表達式不等式,如:證明 2^n > n^3,其中 n > 9

通過使用這三種主要的證明類型,我進一步將查詢類型分解爲更具體的證明子集。下面用一個例子予以介紹。

比方說我們想要證明以下命題:

證明8^n - 3^n能被5整除,其中 n > 0

不是把證明的全部過程生硬地編成代碼,我想讓它儘可能具有一般性,以便能適用於更多的證明。因此,我沒有在應用程序中添加非常具體的證明, 而是添加模式匹配的證明。

表達式8^n - 3^n中,我對8和3並不太關心,因爲即便這些數字變了,證明的邏輯結構仍不會改變。也就是說,如果用戶要證明的是10^n - 3^n能被7整除,步驟不會有任何變化,變的只是數值。爲了利用這一點,我將爲這種類型寫了一個證明解決方案:

證明a^n - b^n能被d整除,其中 n > x。

將用戶的輸入進行模式匹配, 如果檢測到用戶的查詢以此形式 (即遵循此模式), 則將根據此結構輸出證明。然後提取變量(a, b, n, d, x), 以便爲生成的證明提供值。

這個概念在許多不同結構的證明查詢中得以應用。模式匹配方法似乎效率很高,基本涵蓋了我在網上和教科書中遇到的大多數證明題型。任何查詢, 即使先前並沒有遇到過,只要它與應用所知道的一個結構模式相匹配,即可生成證明。

但是, 特定模式匹配實際上僅用於表達式整除性和表達式不等式查詢類型。對於求和/乘積等式, 可以遵循特定的數學方法,應用程序理論上能夠100%處理,而無論等式的右手表達式或求和/乘積的內容如何。此方法適用於求和等式的證明和反證。這是一個很好的功能, 因爲它確保了此查詢類型的歸納證明的完整覆蓋率, 前提是Wolfram|Alpha不會由於輸入過大而超時。

對於表達式的整除性, 生成的大多數證明僅基於與輸入匹配的模式。然而,對於給定表達式沒有成功匹配模式的情況,還有個適用於一般情況的算法可以作爲最後一搏。該算法對表達式執行某種操作, 試圖將表達式放入一個特定形式中。這種形式不過是兩項的加和,其中一項是歸納假設, 另一個包含具有給定除數作爲因子的係數。如果此操作成功, 則可以生成證明。否則將失敗。

對於表達式不等式,所有生成的證明都是模式匹配的, 因爲我還未發現有什麼一般算法能應用於表達式不等式證明。對兩個表達式之間的差異進行模式匹配則更有意義。這不僅有利於不等式運算, 也是消項的一個關鍵步驟。例如, 下面是一個可能的查詢:

證明2n + 7 + sin(n) < (n +7)^2 + sin(n),其中n > 0。

理想情況下,生成的證明與以下內容的模式匹配:

證明 a n + c < (n + b)^d,其中 n > g

問題是模式匹配表達式在不等式兩邊都不包括sin(n)。但是,如果取表達式兩側的差值(例如左側 - 右側),則新查詢將是2n + 7 - (n + 7)^ 2,這與 a n + c - (n+b)^d 的模式匹配。

同樣重要的是要注意,這些變量中有些有時是可選的(即等於0或1),例如是常數、係數和指數。

一開始測試該應用程序時,我注意到有兩種類型的查詢一直生成錯誤的證明。 雖然目標是儘可能多地包含各種證明,但是生成一個數學上不正確的證明,其後果遠比根本不生成證明嚴重得多。 一旦應用程序開始生成無效內容,應用程序的質量和可靠性就會大打折扣。

生成無效證明的第一種查詢類型可以通過下例說明:

證明 4n + 7 > 2^n,其中 n >= 0

在此示例中,初始情況(n = 0)正確通過(因爲7> 1)。 然而,由於實際的命題是錯誤的(即當n = 5時,27 >32不成立),歸納步驟失敗。 但無論出於何種原因,該應用程序試圖生成一個歸納步驟,以使證明有效。 這導致了錯誤,需要被淘汰。 歸納法對於驗證命題成立非常有用,但對於否定命題則並不理想。 因此,對於表達式不等式的查詢,如果初始情況成立但給定查詢爲假,則不生成證明(或"反證")。

生成無效證明的其他查詢類型,可以通過下面這個例子說明:

對於n >= 0,求證 4n < 2^n

這個例子其實相當棘手。左右兩側表達式的大小可以通過下圖直觀地說明:

本例的初始情況是當n = 0時,原式即 4(0) < 2(0),化簡後得到0 < 1,顯然成立。由於初始情況成立,可以進行接下來的歸納步驟。和前面的例子一樣,這個查詢也生成了無效的歸納步驟。問題是歸納步驟的許多計算需要假定 k 在一定範圍內。例如,在上面的證明中,其中一步依賴於k >= 2時,3 < 2^k這個事實。然而,當k值的範圍在0和k >= 2之間時,其中n = k,並沒有證實"4n < 2^n"這個命題成立。因此,初始情況必須也要把 n = 1 和 n = 2包括進來。注意"修正後的證明"需要n > 4,因爲 n = 4 的情況對於 4n < 2^n 不成立。

如果在歸納步驟中進行的運算要求n> = 2,而初始情況是n = 0,那麼我們並未證明查詢對於n = 1或n = 2成立。這與悖論"所有的馬都是同一種顏色" 非常類似。解決這個問題的方法並不是將證明完全刪除。相反,如果在歸納步驟中做出任何假設,則初始步驟將測試n的多個值。 因此,查詢4n <2 ^ n在初始情況下即失敗,因爲對於n = 1,它不成立。

該個課題的最後一項挑戰涉及自然語言處理(NLP)。 允許用戶用英語提問,並讓Wolfram|Alpha理解他們的問題。雖然我之前沒有任何NLP的實戰經驗,但Wolfram | Alpha現有的解析/掃描架構使NLP與應用程序的集成變得相當容易。主要挑戰是確定用戶在就一道歸納法證明題向Wolfram | Alpha提問時的所有可能方式。這將是一個持續的開發過程,因爲不同的查詢語句仍在不斷地添加進來。

應用程序的使用

這是該應用程序在 Wolfram|Alpha上的截屏:

如果您是Wolfram | Alpha Pro用戶,可以通過單擊"Step-by-step solution"(分步求解)按鈕看到生成的證明。 而上述內容所有用戶都能看到。 附加信息已添加到應用程序中,以便向用戶提供重要的詳細信息。 一項功能添加了此結果頁面,即在證明無效時建議使用不同除數。

以下是"修正除數"後生成的證明的截屏:

對於所討論的具有多個初始情況的例子,生成兩個證明:一個顯示初始證明(無效),然後是第二個證明,推薦不同的初始情況以使證明有效:

最後一個很酷的功能是,如果一個求和/乘積等式證明無效,將用推薦的新表達式進行修正:

結語

2015年10月15日,也就是我開始設計原型程序大約十五個月後,該應用程序在Wolfram | Alpha上正式發佈了,這一天令我終生難忘。六天之後,在我的二十一歲生日當天,我在Wolfram技術大會上介紹了這個應用程序。這個項目獲得的成功和熱烈的反響遠遠超出了我的想象。通過一個想法和一點主動性,我來到了世界上最大的計算知識引擎所在的團隊,成爲了其中一員,並且已經工作了一年多。該項目的目標是產生歸納式證明,而這個項目的整個開發過程也是想象力、原創性和努力工作能帶來高回報的完美證明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章