如何寫一個邏輯引擎?

现试用最简单的方法,介绍如何写一个逻辑引擎。

即使是现时最尖端的人工智能,例如 OpenCog,它的内部仍然是很简单的。

逻辑推理 (deduction) 只需要两个算法:

  1. 命题推理
  2. 配对法 (unification)

这两个算法只需要数行程式就能表达 !

逻辑是什么?

逻辑可以分解为两部分:

  1. 命题逻辑 (propositional logic)
  2. 命题内部的结构

命题逻辑

命题逻辑的意思是:  我们只关心命题的真假,而不看命题内部的结构。  所以「小明爱小娟」和「北京昨天下雨」都是同一类句子,只要我们知道它们的真值 (truth value)。

命题之间的关系用箭頭表示,例如:

  1. 吃了不洁食物 $\rightarrow$ 肚痛
  2. 下大雨,没带雨伞 $\rightarrow$ 变落汤鸡

但命题不一定非黑即白,关系也会有不确定因素,所以最严格是要用 fuzzy probability (模糊 机率) 来描述。

推理的算法,原理很简单:

所有命题的关系构成一个 graph,例如下图:

有些 nodes 的真值我们知道,有些不知道; 我们将真值由已知的 nodes「传播」到未知的 nodes 去。 这传播有其法则,例如 机率 要用机率论的法则计算,你甚至可以自创,甚至可以用机器学习那些法则,而不需我们伤脑筋去设计!

所以,你只要懂得怎样在电脑建立和处理 graph 结构,第一个问题便解决了。

谓词逻辑

现在来看看句子内部的结构。

最经典的做法是用谓词逻辑 (predicate logic),那是 Gottlob Frege 在 1879 年发明的。  罗素 (Bertrand Russell) 用它改写所有数学,使之发扬光大,然后 AI 之父 John McCarthy 把它应用在 AI 上,变成 classical AI。  但现在我们搞 strong AI 的人似乎都不太喜欢它,使用一些变奏,但基调一样。

谓词逻辑的做法就是将句子拆成 predicate 和 predicate 里面的 objects。

例如:

「小明爱小娟」 $\Longrightarrow$  爱(小明,小娟)

「北京下雨」$\Longrightarrow$  下雨(北京)

但对於较为复杂的句子结构例如「小明执迷不悟地爱着小娟」则视乎个别研究者的做法,没有统一的准则。  我们暂时不深究。

其实只要用某个方法把句子内部拆开就行,命题的推理方法完全没有变。

但句子拆开之后,我们可以在里面使用 variables (变量),那是很有用的。

例如,我们可以构造:

爱(小明,X)

那变量 X 可以是 小娟、美玲、等。

於是现在我们需要另一个算法,叫 unification (配对)。

Unification

Unify 的作用是:  给定两个句子 A 和 B,它们内部可以很复杂,也可以有 variables,而我们试图找一些 substitutions (代入),令那两句变成一样

例如:

爱(X,Y)

爱(小强,美玲)

这两句命题,只要代入{X = 小强,Y = 美玲},就可以变成同一句。

当然有些命题是无法 unify 的,例如:

爱(小明,小娟)

恨(小明,X)

那算法便会回覆 "fail"。

变量是很重要的发明,有了变量才可以表达 general rules (一般法则),例如:

「女人都说谎」换成逻辑就是:

女人(X) $\rightarrow$ 说谎(X)

有些人被女人骗过一次之后,便永远不信女人;  所以人脑的思想也是透过 generalization (一般化) 来学习的。  那是机器学习的範围,容后再谈。

Unify 所做的其实是 pattern matching。

例如:

戴眼镜(X) 或 爱(小明,Y)

是一些模式,可以套到:

戴眼镜(美玲) 或 爱(小明,小娟)

这些实例上。

人工智能就是一个很大的资料库,里面有很多用模式写成的 general rules,经过配对而产生新的推论。  例如 小娟是女人,所以用上面那条 general rule,得出小娟说谎的结论。

时间: 2024-11-02 07:47:47

如何寫一個邏輯引擎?的相关文章

在 Swift 專案中使用 Javascript:編寫一個將 Markdown 轉為 HTML 的編輯器

原文:Using JavaScript in Swift Projects: Building a Markdown to HTML Editor 作者:GABRIEL THEODOROPOULOS 譯者:kmyhy 一直想寫一篇文章,關於如何將 Swift 和 Javascript 結合在一起,以構建強大的支持富文本的 App.這並不是我們第一次聽人說要將 Javacript 代碼嵌入到 iOS 專案中了,但當你讀完本文后,你會感到這個過程會變得前所未有的簡單,仿佛魔術一般,你只需要做很少的工

[Verilog]寫一個 Watch Dog Timer程式

看門狗計時器是一種計時裝置,當系統的主程式發生某些錯誤事件時,如假死機或未定時的清除看門狗計時器的內含計時值(多半是向對計時器發送清除信號),這時看門狗計時器就會對系統發出重設.重新開機或關閉的信號,使系統從懸停狀態回復到正常運作狀態.看門狗一旦使用則不能停止.一般情況下計數器在系統休眠時依然計數,但在某些晶片上,處於低功耗模式下的看門狗僅僅保留暫存器資料但不計數. 簡單來說就是防止系統死當,在程式設計時常會發生系統當機,而需要重新開機,那如何用FPGA來寫呢? Q: 請寫出一個硬體電路,必須在

(二) conjunctive normal form, MiniSat

conjunctive normal form, MiniSat SAT solver 是解決 SAT 問題的程式的統稱,這裡介紹一些先備知識,以及 miniSAT 這套開源的 SAT solver. 一些名詞定義 variableboolean function 裡面用到的那些值就叫 variable,例如: (?a ∨ b ⊕ x),a, b, x 就是它的 variable,當然 variable 要取什麼名子都可以. literal在 boolean function 中實際出現的 va

超过2T的磁盘格式化

fdisk只能够使用于小于2T磁盘,大于2T磁盘就需要使用PARTED工具分区 一.进入parted 1.parted /dev/sdb 2.(parted) print free Model: LSI MegaRAID 8708ELP (scsi) Disk /dev/sdb: 7438GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name

操作系統3-內存管理(分區存儲和頁式存儲)

操作系統3-內存管理(分區存儲和頁式存儲) 2. 分區存儲管理方式 分區管理的基本思想是:將內存空間氛圍一個或若干個連續的區域,稱為分區.每個分區可以存放一個獨立的用戶程序.分區的特點是一個程序可以連續地加載內存. 分區可以分為:單一分區.固定分區.可變分區和重定位分區. 2.1 單道程序的連續分配 單道程序的連續分配方式將內存分為系統區和用戶區,只能用於單用戶.單任務的操作系統. 系統區 系統區僅供操作系統使用,一般駐留在內存的低地址區,其中包括中斷向量.中斷向量是操作系統的核心功能模塊加載內

學習 React.js:用 Node 和 React.js 創建一個實時的 Twitter 流

Build A Real-Time Twitter Stream with Node and React.js By Ken Wheeler (@ken_wheeler) 簡介 歡迎來到學習 React 的第二章,該系列文章將集中在怎麼熟練並且有效的使用臉書的 React 庫上.如果你沒有看過第一章,概念和起步,我非常建議你繼續看下去之前,回去看看. 今天我們準備創建用 React 來創建一個應用,通過 Isomorphic Javascript. Iso-啥? Isomorphic. Java

學習 React.js:用 ReactJS 30 分鐘打造一個移動應用

Make a Mobile App with ReactJS in 30 Minutes Ken Wheeler (@ken_wheeler) React 能讓前端開發者以前所未有的方式來構建應用.它有許多好處:比如單向數據流,簡單的組件生命週期,聲明組件之類的. Reapp 是最近發佈的基於 React 的一個框架.它是一個專為性能和生產效率而生的移動應用平台.你可以把它看做是一個精心優化過的 UI 組件,並且帶有一套很好的編譯系統,以及許多有用工具,能讓你輕松構建你的應用. Reapp 給我

一次快速改寫 SQL Server 高效查詢的範例

最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提昇了約數百倍以上 首先,原本應用端的商務邏輯為每一分頁筆數固定為10筆,所以使用者最多可以匯出 10 筆資料 而且原本的商務邏輯是寫成這樣的 這段語法在 SQL Server 執行時,會轉換成以下的範例語法 (這裡 A 表 與 B表 為 1:N 關聯 ) SELECT LawNo,LCNo FROM A INNER JOIN B WHERE 1=1 AND

[SharePoint 2010] Visual Studio 2010內撰寫視覺化WebPart超簡單

新一代的Visual Studio 2010對於SharePoint 2010的專案撰寫,有非常另人讚賞的改進. 以往寫一個WebPart要搞好多雜七雜八的步驟,也要硬寫HTML輸出,當然有人說可以寫UserControl後再掛在其它的WebPart容器內, 但是也是須要不少工夫去處理它. 現在,這些問題都沒了,簡單的幾個步驟,就可以做出功能強大的WebPart,而且偵錯方法也非常簡單. 新一代的Visual Studio 2010對於SharePoint 2010的專案撰寫,有非常另人讚賞的改