2009-06-11 191 views
1

我正在開發一個推理機,這意味着基本上我有一定數量的「事實」,它們基本上是某個時刻世界的表示。加上事實(通常只有兩個,起始狀態和目標狀態),我有很多規則(對於某些問題,字面上可能是幾百)。推理機的目標是,給定一個開始狀態和一組規則,找到可接受的目標狀態之一的最短路徑。這可以通過幾種算法完成,如DFS,BFS或A *。本方案的基本結構是:模式匹配中的變量替換?

 
fact factname 
    attribute1 = "value"; 
    attribute2 = [ 1, 2, 3]; 
    attribute3 = 4; 
    attribute4 = 7; 
    ... 
endFact 

rule ruleOne 
    equalsto(attribute, "value") or 
    greaterthan(attribute, 5) 
    > 
    remove(attribute); 
endRule 

rule ruleTwo 
    isprimeinteger(attribute) 
    > 
    add(attribute, 1) 
endRule 

在規則中,LHS(前面的部分>)匹配以下事實factname其等於「值」每屬性。在這種情況下,它只有一個,但可能有很多。 這意味着我必須解決變量(通常爲同一事實多次),規則的LHS可能會有多個條件和/或適當的優先級解析。

問題是:有什麼辦法可以有效地解決這種變量?我現在所做的是迭代事實中的每個屬性,基本上我生成一個相當大的n-ary樹,它甚至是不平衡的,而且這非常慢,尤其是考慮到上述條件。

我很想指針文件爲這種模式,您使用的是O(N)的算法匹配

+0

你能解釋一下你的問題更精確一點嗎?我很難理解它。你如何得到某個州可以達到的州?你對變量有什麼意義? (我只能看到'屬性',這似乎是一個非常特殊的變量,還有其他嗎?)我無法檢測到任何模式匹配(或統一),也無法看到標籤專家系統的相關性'和'C++'。最後,如果您想要最短路徑,DFS似乎不是一個好選擇。 – mweerden 2009-06-12 00:39:45

回答

0

沒有大的驚喜在這裏,其中一個簡單的哈希表是O(1)。散列表將爲每個屬性值存儲相應的屬性。

+1

不,在這種情況下,散列表無用。也許這個例子沒有給出這個想法,但是我可能在LHS中有這樣的事情:greaterthan(variable_name,2),並且這必須給變量名* all *事實的值大於2的屬性(並且可能存在許多)。 – user121155 2009-06-11 08:53:35

2

我注意到你沒有使用這個詞統一任何地方在你的文章中。這就是你試圖實現的算法通常被稱爲。查看Wikipedia文章;底部有一些參考文獻......其中包括70年代當空間和週期重要時的參考文獻。

0

eduffy有它:這就是所謂的統一。 Prolog是一種編程語言,旨在完成你想要做的事情,在一般情況下,它使用統一來完成它的骯髒工作。

但是,任何試圖在Prolog中使用Peano公理實現算術的人都可以告訴你,它並不總是以最快的方式到達那裏。有一些「約束編程」語言可以做大致相同的事情,但重點在於提供啓發式方法,以幫助求解器儘快找到最佳解決方案。其中之一是Comet