標籤:

自然語言與程序語言的思考

自然語言與程序語言的思考

來自專欄 程序員的日常我先試著講一個簡單的例子

  1. 概念
    1. 動物
      1. 動物能叫
      2. 動物能咬某個動物
      3. 動物能感覺疼
      4. 動物能死掉
      1. 狗是一個動物
      2. 狗叫的時候
  • 顯示「汪」

  • 狗咬某個動物的時候
    • 該動物感覺疼

    • 該動物死掉
    1. 貓是一個動物
    2. 貓叫的時候
    • 顯示喵

  • 貓咬某個動物的時候
    • 該動物感覺疼

    class Animal{ virtual void Sound() = 0; virtual void Bite(Animal& a) = 0; virtual void FeelHurt() = 0; virtual void Die() = 0;}class Dog : public Animal{ virtual void Sound(){ print("wang"); } virtual void Bite(Animal& a) { a.FeelHurt(); a.Die(); }}class Cat : public Animal{ virtual void Sound(){ print("meow"); } virtual void Bite(Animal& a) { a.FeelHurt(); }}

    以上兩端不同語言的東西應該是完全等價的,那麼到底有沒有可能讓我們把上面這一段中文,自動的翻譯成下面的代碼呢?

    我覺得並不是完全沒有希望(當然這好像目前算是一個未解決的難題),以下是一些想法

    一篇中文文檔中應該是一個良好的樹。其中可以包含這些節點:

    • 頂級節點應該是:話題,概念,對象,常數(等)
    • 話題:話題節點下的所有子節點用於生成namespace,這些節點只需要一個名稱
    • 概念:概念節點下的所有子節點用於生成class
      • 一個子節點的名稱就是class的name
      • 其下的子節點可以包括:
        • 主語+具有+x:主語是classname(或許也可以省略,或用代詞「他」),這用於生成一個屬性
        • 主語+能夠+動詞:定義一個函數(方法)
        • 主語+能夠+(介詞+泛指代詞+名詞)+謂語+泛指代詞+名詞+(介詞+泛指代詞+名詞):定義個一個帶參數的函數,其中泛指代詞(某個,某種,某隻,中文這裡因為量詞的關係比較複雜,反倒是英文可以直接用a/an, a dog, a cat)用於標記一個形參,而介詞及其賓語,謂語的賓語按照某個指定順序生成參數列表
          • 動詞節點應該擁有子節點,定義了函數的實現(如果沒有則是純虛函數)
          • 其中每一行均是一個語句,根據主語,查找其在概念節點中的動詞,然後根據該動詞的定義解析介詞和賓語的位置,並放入函數調用的參數列表
    • 對象:對象節點下的子節點是其父節點下的變數
      • 實例或許可以這樣:有一隻狗叫小黃
      • 有(變數定義關鍵字)一隻(泛指代詞,無意義)狗(變數類型)叫(變數定義關鍵字)小黃(變數名稱)
      • 生成代碼為:"Dog Huang;"(當然中英文轉換需要一個字典)
    • 常數:和對象差不多,只是加上const

    嗯,先做這樣一個簡單的筆記,有機會再逐步擴充
    推薦閱讀:

    【工具】 根據云音樂歌單,下載FLAC無損音樂到本地
    怎麼證明我們的宇宙不是個程序?
    為什麼instagram被牆以後還能收到推送的通知?
    11 個免費學習編程的好地方
    有哪些適合編寫 C / C++ 的軟體?

    TAG:程序 |