我在語言練習中停留了一些語法。這是我第一次用語法(用任何語言)。我需要創建一個解析器,它將計算機器人的目標座標以及當前指向的方向(以n,s,w,e之一表示)。序言,機器人移動語法+解析器
可能的舉措是:[go,10]
(或任何數字),[turn, left]
,[turn, right]
。 這是很容易(我覺得..)編寫解析器識別正確的句子,如:[go,10,turn,right,go,10]
:然而
robot_p-->pol.
pol-->[go],num.
pol-->[go],num,pol.
pol-->[turn],[left].
pol-->[turn],[left],pol.
pol-->[turn],[right].
pol-->[turn],[right],pol.
num-->[D],{number(D)}.
robot(L):-robot_p(L,[]).
現在,我不知道,我怎麼會積累每一個步驟,因此對於句子我舉了一個例子,結果是[10,10,e]
。我想我應該寫這樣的東西:
robot_p(result)-->pol(result).
但是,如果是這樣,它會怎麼樣呢?我可以改變num
到:
num(D)-->[D],{number(D)}.
下,這將啓動:
pol([X,Y,N])-->[go],num(D),{N==n;//here I don't know what next}.
然而,我不知道這是否是好辦法,如果是這樣,現在給做。
編輯:
我忘記說了,我需要通過開始座標。 因此,對於[0,0,n]
和移動[go,10,turn,right,go,10]
結果是[10,10,e]
。
EDIT2:
非常感謝@BretC尋求幫助。我已經按照你的提示創建了令我滿意的版本。也許這將幫助別人:)
pol([X])-->[go],num(X).
pol([X| T])-->[go],num(X),pol(T).
pol([left])-->[turn],[left].
pol([left | T])-->[turn],[left],pol(T).
pol([right])-->[turn],[right].
pol([right | T])-->[turn],[right],pol(T).
commands(L,V):-pol(V,L,[]).
move([X,Y,D],V,[X1,Y,D]):-D==n,X1 is X+V.
move([X,Y,D],V,[X1,Y,D]):-D==s,X1 is X-V.
move([X,Y,D],V,[X,Y1,D]):-D==w,Y1 is Y-V.
move([X,Y,D],V,[X,Y1,D]):-D==e,Y1 is Y+V.
rotate(D,P,D1):-P==left,D==n,D1=w.
rotate(D,P,D1):-P==left,D==s,D1=e.
rotate(D,P,D1):-P==left,D==w,D1=s.
rotate(D,P,D1):-P==left,D==e,D1=n.
rotate(D,P,D1):-P==right,D==n,D1=e.
rotate(D,P,D1):-P==right,D==s,D1=w.
rotate(D,P,D1):-P==right,D==w,D1=n.
rotate(D,P,D1):-P==right,D==e,D1=s.
robot_H(D,[],D).
robot_H([X,Y,D],[H|T],K):-number(H),move([X,Y,D],H,ND),robot_H(ND,T,K).
robot_H([X,Y,D],[H|T],K):- \+number(H),rotate(D,H,D1),robot_H([X,Y,D1],T,K).
robot(S,P,K):-commands(P,P1),robot_H(S,P1,K).
num(X)-->[X],{number(X)}.
所以,舉例來說:
?- robot([0,0,n],[go, 10, turn, left,turn,left, go, 20],K).
K = [-10, 0, s]
應該不是'POL的一個稱之爲 - >【轉],[右],pol.'線實際上是'pol-- > [轉],[左],pol'? – BretC
謝謝,通過重寫錯誤(在Prolog中,我有不同語言的公式)。 –