2012-07-24 59 views
1

我需要關於Prolog的幫助。 我發佈了我的代碼,問題是我沒有獲得預期的結果。 我希望規劃動作在表格中移動所有塊直到可能。要做到這一點,我提示:循環中的Prolog錯誤

?- do(while(some(x, block(x) & -onTable(x)),pi(x,putOnTable(x))),s0,S). 

我希望看到的響應,如:

S = do(putOnTable(e), do(putOnTable(b), do(putOnTable(c), s0))) 

但Prolog的僅返回 「假」。有人可以幫助我?

% Golog interpreter 
%:- [golog_swi]. 

:- discontiguous clear/2, on/3, onTable/2. 

:- op(800,xfy,[&]). 

do(E,S,do(E,S)):- primitive_action(E),poss(a,S). 

% Primitive Action Declarations. 
primitive_action(putOn(_,_)). 
primitive_action(putOnTable(_)). 


poss(putOn(X,Y),S) :- clear(X,S), clear(Y,S), \+ on(X,Y,S), \+ X=Y. 
poss(putOnTable(X),S):- clear(X,S), \+(onTable(X,S)). 

% Successor State Axioms. 
on(X,Y,do(A,S)):- A = putOn(X,Y); on(X,Y,S), \+ (A = putOnTable(X); A = putOn(X,_)). 
onTable(X,do(A,S)) :- A = putOnTable(X); onTable(X,S), \+ A= putOn(X,_). 
clear(X,do(A,S)) :- on(Y,X,S), (A = putOn(Y,_) ; A = putOnTable(Y)); clear(X,S), \+ A = putOn(_,X). 

% Restore suppressed situation arguments 
restoreSitArg(onTable(X),S,onTable(X,S)). 
restoreSitArg(on(X,Y),S,on(X,Y,S)). 
restoreSitArg(clear(X),S,clear(X,S)). 

block(X):- member(X,[a,b,c,d,e]). 

% iniTial COndition 
onTable(a,s0). 
on(b,a,s0). 
on(c,b,s0). 
clear(c,s0). 
onTable(d,s0). 
on(e,d,s0). 
clear(3,s0). 

謝謝!!!

回答

1

您的謂詞do/3無法成功,因爲目標primitive_action/1將與您的查詢一起失敗。

目前,while/2未在primitive_action/1中描述,它似乎也從您的程序中丟失。因此,您需要通過更多事實來擴展primitive_action/1,或者向do/3添加新規則。除此之外,你需要描述什麼while/2的含義。

+0

我tryed添加這些定義爲:和而卻始終結果是一樣的.... %:定義 做(E1:E2,S,S1): - DO(E1 ,S,S1),執行(E2,S,S1)。 ((P,E),S,S1): - do(star(?(P):E):?( - P),S,S1)。 其他建議?請!!! – angelius 2012-07-24 15:24:47

1

這個問題其實是關於Golog。你的錯誤非常平凡:你沒有將Golog解釋器代碼複製到源文件/目錄中。

Golog定義了許多高級編程結構,包括while循環和非確定性選擇(pi),在這裏使用。我敢肯定,你不想重塑Golog,所以只需去獲取它。我假設你的問題是各種任務的一部分,你的老師可能會向你指出Golog口譯員。否則,您可以隨時在大學的認知機器人組頁面上找到它。多倫多:http://www.cs.toronto.edu/cogrobo/main/systems/index.html