謂詞邏輯 (Predicate Logic)

邏輯推論

簡介

布林邏輯

皮諾公設系統

一階邏輯

完備定理

不完備定理

程式實作

布林推論

一階推論

相關訊息

相關網站

相關書籍

參考文獻

最新修改

訊息

相關網站

參考文獻

最新修改

簡體版

English

簡介

布林邏輯、謂詞邏輯與一階邏輯是最常被使用的兩種邏輯系統,布林邏輯在電路設計上有強大的用途,而一階邏輯則成為人工智慧領域的理論基礎。

謂詞邏輯乃是布林邏輯的延伸,此種邏輯具有一種類似布林函數的基本元素,通常稱為謂詞 (Predicate),因此稱為謂詞邏輯 (Predicate Logic) 。

一階邏輯乃是謂詞邏輯的延伸,包含兩個很特別的量詞運算,全部 (forall) 與存在 (exist) 等,如果我們不處理這兩個運算,則將退化為謂詞邏輯。

謂詞邏輯的推論

謂詞邏輯的推論法則有很多種,在此我們使用最簡單且強大的羅氏 (Robinson) 推論法則,利用解析法 (Resolution) 進行推論。

我們設計了一個一階邏輯的推論器,用來對這種較弱的謂詞邏輯進行推論,以下 Java 程式片段是其推論引擎的核心。

    /**@param pRules Example : "a(X,Y)|-p(X,Y);a(X,Y)|-p(X,Z)|-a(Z,Y);p(a,b);p(b,c)".split(";")
      *@return Example : "a(a,b);a(b,c);a(a,c);" */
    public static String unitResolution(String[] pRules) {
        Vector rules = new Vector(Arrays.asList(pRules));
        for (int ri=0; ri<rules.size(); ri++) {
         String rule1 = (String) rules.get(ri);    
         if (rule1.indexOf("|")>0) continue; // it's not a unit rule
         String negTerm1 = negate(rule1);     // negate the unit rule
         String negTag   = STR.head(negTerm1, "(");
         for (int rj=0; rj<rules.size(); rj++) {
         String rule2 = (String) rules.get(rj); // ex : unify e(a) with b(a),-d(a),-e(a) => b(a),-d(a)
         String[] terms2 = rule2.split("\\|");     // terms2 = {-e(X)}
         for (int ti=0; ti<terms2.length; ti++) {
         String tag = STR.head(terms2[ti], "(");
         if (!tag.equals(negTag)) continue;
         String unify = unify(negTerm1, terms2[ti]);     // unify e(a), -e(X)
         if (unify == null) continue;
         String bindRule  = STR.expand(rule2, unify);        // b(X),-d(X),-e(X) => b(a),-d(a),-e(a)
         String unifyRule = STR.replace("|"+bindRule+"|", "|"+negTerm1+"|", "|"); // ,b(a),-d(a),-e(a), => ,b(a),-d(a)
         unifyRule = STR.trim(unifyRule, '|'); // ,b(a),-d(a), => b(a),-d(a)
         if (rules.indexOf(unifyRule) < 0) {
         rules.add(unifyRule);
         System.out.println(rule1+"  "+rule2+"\r\n ["+unify+"] => "+unifyRule);
         }
         }
         }
        }
        StringBuffer facts = new StringBuffer();
        for (int ri=pRules.length; ri<rules.size(); ri++) {
         String rule = (String) rules.get(ri);
         if (rule.indexOf("|") < 0)
         facts.append(rule+";");
        }
        return facts.toString();
    }

結語

羅氏的謂詞邏輯推論法具有理論上的重要性,既簡單又優美,本文對該方法進行了一個簡易的實作,雖然不夠完整,但希望能清楚的說明其原理。

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License