2011-05-23 104 views
5

在java中推理過程的實現正向鏈接和反向鏈接的最佳方法是什麼?java中的正向鏈接和反向鏈接

我們已經給出了具有陳述性的角形知識庫。

我試圖在互聯網上搜索,但我無法找到任何關於如何將這些人工智能概念實現爲編碼的描述。

我的理解:

到目前爲止,我會讀每一個句子(喇叭型)和創建它的對象我已經想好。每個Sentence類對象都會有關係變量,當我向Backward或Forward鏈詢問知識庫時,它將檢查這些對象的數組並構造我想要的鏈。

public class Sentence{ 

    private String impliedBy; 
    private String implementedVar; 

    public Sentence(String sentence){ 
     String[] relation = sentence.split("=>"); 
     this.impliedBy = relation[0]; 
     this.implementedVar = relation[1]; 
    } 
    ... 
} 

說上面的類調用...

Sentence s = new Sentence("a&b=>c"); 

上午我就對不起正軌,我對這些類型的複雜編程的小白和按我的預測,我可能需要大量的優化來在非常高的層面上運行這些推理。但似乎我需要一個人很好的理解,謝謝你,如果你們中的一些人可以幫助...

謝謝!

回答

6

在我嘗試爲自己寫這個之前,我會使用像DroolsJESS這樣的規則引擎。

除非你的目的是要學習如何編寫一個Rete規則引擎,在這種情況下,我會撤回我的答案。我會去尋找Charles Forgy's論文。

+0

我認爲這是一項功課。檢查一個簡單的Horn子句是否成立,確實不是特別困難。即使是一個HORNSAT也不應該太難以正確 - 但是之後我們需要知道究竟應該實施什麼。 – Voo 2011-05-23 01:12:46

+0

非常感謝你,我已經擴展了我對這些技術的理解......但是,我可能不得不在更高級別上進行更多研究,所以Voo說我的作業必須更容易解決,但是我想如果我正在學習某些原因不要學習正確有效的方法,:)謝謝 – doNotCheckMyBlog 2011-05-23 03:10:57

+0

@Voo,是的,你是對的!如果我的上述給定的想法(問題)正確無誤,那麼實現起來相當容易。 :) 感謝幫助。 – doNotCheckMyBlog 2011-05-23 03:11:56

0

那麼還有什麼可以幫助的是通過使用:

HashMap map = new HashMap(); map.put(impliedBy,impliedVar);

要簡單得到var:String value = map.get(impliedBy)。

1

here如何獲得向前的線性時間鏈接工作中的變量的數量(注意片斷如何實施遍歷議程中每個變量的條款)。它沒有代碼,但Hornsat真的不難編碼。

1

諸如OPS5之類的系統通常具有使用前向鏈接的推理組件 。另一方面Prolog通常使用反向鏈接 。

兩個正向&反向鏈可以被看作是不同的 策略來處理解決方案。而正向鏈接 對應於單位分辨率,反向鏈接將對應於輸入分辨率 。

也可以構建可以包括 向後鏈接內部反向鏈接的系統,其控制方式爲 。一個這樣的系統是Jekejeke Minlog

一個可能的實現à馬文·明斯基將 作爲一個網絡看HornClauses。 HornClauses 有一個頭X和HornClauses,在身體 X將被連接。

A <- D, X  X <- G 
      |  | 
      +------+ 

現在霍恩子句的身體作爲一種與門, 和由於不同的HornClauses可以有相同的頭部 也有參與或門。現在嘗試編程 ,沿着這些門傳播真理。

再見