zoukankan      html  css  js  c++  java
  • 如何寫一個邏輯引擎?

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

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

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

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

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

    逻辑是什么?

    逻辑可以分解为两部分:

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

    命题逻辑

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

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

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

    但命题不一定非黑即白,关系也会有不确定因素,所以最严格是要用 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) $ ightarrow$ 说谎(X)

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

    Unify 所做的其实是 pattern matching。

    例如:

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

    是一些模式,可以套到:

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

    这些实例上。

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

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/geniferology/p/how_to_write_a_logic_engine.html
Copyright © 2011-2022 走看看