2013-05-16 60 views
-1

我學習的Prolog DCG語法*和**解析樹在伊萬·布拉科書有些疑惑:「編程人工智能」有關如何工作的意義謂詞解譯DCG語法解析樹在序言

下面的示例提供了一種DCG語法,它可以從屬於定義語言的字符串中創建一個分析樹,但我發現有些困難。

所定義的語言是一個機器人手臂的動作,可以是隻有兩種類型的列表:向上向下所以[向上,向上,向下,向上,向上]屬於所定義的語言通過我的DCG語法。

該方案提供還一個含義/ 2謂詞解釋具有一定字符串和相關的語法分析樹指通過機器人臂越過距離(儘管它與拉昇值相關聯+ 1,和值-1到向下移動)

因此,例如,對於該列表[向上,向上,向下,向上,向上],所述意味着/ 2謂詞計算3距離

這是我的例子的代碼(工作做好):

move(move(Step)) --> step(Step). 
move(move(Step, Move)) --> step(Step), move(Move). 

step(step(up)) --> [up]. 
step(step(down)) --> [down]. 

/* Take the parse tree of a string that belong to the language defined by the DCC grammar and 
    calculate the total distance whereas that an up move give a +1 distance and a down move 
    give -1 distance 
*/ 
meaning(move(Step, Move), Dist):- 
            /* Calculate the distance given by the current step node 
            (which can be +1 or -1) */ 
        meaning(Step, D1), 
        /* Calculate the distance given by the current moove node 
            (which must be calculated recursively on a subtree having 
             a moove node as root */ 
        meaning(Move, D2), 
        /* The final distance series of moves is the distance of the 
            current step + the distance diven from the moves in the 
            moove subtree */ 
        Dist is (D1 + D2). 

meaning(step(Step), Dist):- meaning(Step, Dist). 
meaning(move(Step), Dist):- meaning(Step, Dist). 

% step(up) means that the distance is +1 
meaning(step(up), 1). 

% step(down) means that the distance is -1 
meaning(step(down), -1). 

所以我有含義/ 2謂詞采取解析樹並計算移動的總距離。

所以,我有2 BASE CASE該rappresent關聯到單個移動(到步驟)之間的距離的值,即可以是1用於向下步向上步和-1:

meaning(step(up), 1). 
meaning(step(down), -1). 

含義/ 2採取解析樹,通過將DCG文法所定義,具有一個舉動節點作爲根:這根將具有左孩子是一個步驟節點(因此它是一個單移動,所以它有一個特定的距離+1或-1)和一個正確的孩子是移動節點(所以它rappresent另一子樹)

所以總距離是當前步驟,其是1或的距離的總和-1 +(的當前移動根左子)距離在右子樹。

我認爲這是正確的,這對我來說

,我不明白事情很清楚是什麼東西代表了我這兩個謂詞代碼:

meaning(step(Step), Dist):- meaning(Step, Dist). 
meaning(move(Step), Dist):- meaning(Step, Dist). 

我可以不沾他們在我的推理:-(

+1

是否真的有必要複製整個問題和書籍部分以獲取有關這四行代碼的幫助?另外,你是否試圖運行代碼?這些規則很明顯是這樣做的:他們讓你直接從DCG中對包裝事實調用「意義/ 2」。他們只是解開額外的結構層。 –

回答

2

我們使用這些規則像這樣,

4 ?- phrase(move(X), [up,up,down,up,up]). 
X = move(step(up), move(step(up), move(step(down), move(step(up), 
     move(step(up)))))) ; 
false. 

5 ?- meaning($X,N). 
N = 3 ; 
false. 

產生的術語是高度嵌套:

move(step(up),       % move/2: step/1 , 
    move(step(up),      % move/2: step/1 , 
      move(step(down),    %  move/2: step/1 , 
       move(step(up),   %  move/2: step/1 , 
        move(step(up)))))) %   move/1: step/1 . 

您詢問的代碼,除掉從化合物而言functors,獲得到的它的「肉」,即updown原子arguments

(2)meaning(step(Step), Dist):- meaning(Step, Dist).

「找到一元化合物術語step(X)的‘’意義‘’,是找到的‘’意義‘’相同「

(3)meaning(move(Step), Dist):- meaning(Step, Dist).

「找到一元化合物術語move(X)的 '' 意義 '',是找到X的 '' 意義 '' 相同的」

(4)基例: '' 意思 '' 給定爲1-1用於updown原子。

meaning(step(up), 1).     % clashes with rule (2) 
meaning(step(down), -1).     % clashes with rule (2) 

(1)和主要情況與二元化合物方面涉及的是仿函數move

meaning(move(Step, Move), Dist):- 
    meaning(Step, D1), 
    meaning(Move, D2), 
    Dist is (D1 + D2). 

move/2是(非空)單,'.'/2,實際的自定義版本:

1 ?- write_canonical([1,2,3]). 
'.'(1,'.'(2,'.'(3,[]))) 
true. 

2 ?- write_canonical([step(up),step(down),step(up)]). 
'.'(step(up),'.'(step(down),'.'(step(up),[]))) 
true. 

meaning/2fold

+0

tnx這麼多!現在這很清楚。 – AndreaNobili

+0

我很抱歉,如果有時我會提出很長的問題,但否則我害怕不清楚的問題 – AndreaNobili

+2

@AndreaNobili你很好地來了,開始相信你的能力更多* *釋義*和*總結*;更甚者,讓Prolog代碼爲自己模式說話。 :) –