2013-04-13 85 views
-1

我使用SWI Prolog的學習Prolog的一個universitary大學考試進行furmulas的符號操作,我有一些關於它如何工作這個練習使用該大學有些疑惑= ..=..謂詞來執行的furmulas其中頻繁操作是substituite替代一些子表達式由另一表達符號操作。使用謂語= ..在序言

它是執行定義以下關係式:

substituite(SubTerm,期限,SubTerm1,起租1)

,這是TRUE,如果起租1 rappresent表示期限表達,其中所有的SubTerm的出現由SubTerm1代替。

例如,如果我有:

substituite(的sin(x),2 *(的sin(x)),T,F)。

然後:F = 2 * T * F(T),因爲所有的sin(x)的出現是用t substituited

這是解決方案(上Bratko書founbd),但我不這麼肯定我的解釋:

% substitute(Subterm, Term, Subterm1, Term1) 
% Term1 is Term with all occurrences (by matching) 
% of Subterm are replaced by Subterm1. 
% Test: ?- substitute(b, f(a,b,c), e, F). 
% Test: ?- substitute(b, f(a,X,c), e, F). 
% Test: ?- substitute(b, f(a,X,Y), e, F). 
% Test: ?- substitute(a+b, f(a, A+B), v, F). 
% Test: ?- substitute(b,B,e,F). 
% Test: ?- substitute(b,b,e,F). 
% Test: ?- substitute(b,a,e,F). 

% Logic, there are three cases: 
% If Subterm = Term then Term1 = Subterm1 
% otherwise if Term is 'atomic' (not a structure) 
% then Term1 = Term (nothing to be substituted) 
% otherwise the substitution is to be carried 
%  out on the arguments of Term. 

/* Case 1: SubTerm = Term --> SubTerm1 = Term1 */ 
substitute(Term, Term, Term1, Term1) :- !. 

% Case 2: Se Term è atomico non c'è niente da sostituire 
substitute(_, Term, _, Term) :- atomic(Term), !. 

/* Case 3: 
substitute(Sub, Term, Sub1, Term1) :- 
    Term =.. [F|Args],     % Term è composto da: F è il FUNTORE PRINCIPALE ed Args è la lista dei suoi argomenti 
    substlist(Sub, Args, Sub1, Args1),  % Sostituisce Sub1 al posto di Sub nella lista degli argomenti Args generando Args1 
    Term1 =.. [F|Args1].     % Term1 è dato dal FUNTORE PRINCIPALE F e dalla nuova lista degli argomenti Args1 

/* sublist: sostituisce all'interno della lista degli argomenti: */ 


substlist(_, [], _, []). 


substlist(Sub, [Term|Terms], Sub1, [Term1|Terms1]) :- 

    /* L'elemento in testa Term1 corrisponde all'eventuale sostituzione */ 
    substitute(Sub, Term, Sub1, Term1), 

    /* Il problema è già risolto per le sottoliste e Terms1 rappresenta la sottolista Terms in cui tutte le occorrenze di Sub 
     sono già state sostituite con Sub1: 
    */ 
     substlist(Sub, Terms, Sub1, Terms1). 

的第一條規則rappresent代表的具體情況,其中SubTerm =期限所以最終起租1 = SubTerm1(因爲我substituite替代整個術語)

第二規則rappresent表示其中期限是原子這樣的特定情況下,無論該值的SubTerm和SubTerm1,我沒有執行任何替換

我認爲,直到這裏它很簡單,我的推理是正確的......在它旁邊開始更困難的部分,我不太確定...

規則:

substitute(Sub, Term, Sub1, Term1) :- 
    Term =.. [F|Args],      
    substlist(Sub, Args, Sub1, Args1),  
    Term1 =.. [F|Args1].  

rappresent表示,其中我有一個表達通過期限 rappresented表示一個通用的情況下,其可能的子表達式rappresented由下式表示 Sub,一個新的子表達式Sub1當您遇到SubTerm1的出現時,最終應該被替換,該替換表示SubTerm的所有出現都被SubTerm1替代的術語表達。

這樣我就可以在聲明閱讀本whay方式

這是事實,起租1 rappresent 代表期限式,即SubTerm的所有出現由SubTerm1如果有TRUE substituited以下事實

1)原表達期限可以在列表中被分解具有在其頭部主函子F(在表達式評估中執行的第一個運算符)和稍後的子列表參數,它表示此函數的參數F(我認爲,在某些情況下,Args也可以包含其他函子,這個計算步驟,不是主函子...所以在這種情況下仍然有一些子問題需要解決)

2)的確,substlist(Sub,Args,Sub1,Args1)表示這是Args1表達式中的所有參數等於Sub子表達式的Args都被Sub1子表達式取代。

3)最後,它必須是真實的,新的起租1是大學的結果= ..謂詞beetwen主要仿函數F和新的參數列表Args1(我認爲= ..重組主要仿函數f控制新的參數列表

要藉此在中參數的替代清單,它使用substlist關係,它分爲:

基本情況:

substlist(_, [], _, []). 

,簡單地說:如果沒有在參數列表,沒有什麼取代

一般情況下:

substlist(Sub, [Term|Terms], Sub1, [Term1|Terms1]) :- 

    /* L'elemento in testa Term1 corrisponde all'eventuale sostituzione */ 
    substitute(Sub, Term, Sub1, Term1), 

    /* Il problema è già risolto per le sottoliste e Terms1 rappresenta la sottolista Terms in cui tutte le occorrenze di Sub 
     sono già state sostituite con Sub1: 
    */ 
     substlist(Sub, Terms, Sub1, Terms1). 

這是比較難的部分,以瞭解我的,我看到它在下面的方式,聲明內容如下:

這是真的,[起租1 | Terms1] rappresent的參數[期限名單| (Sub,Term,Sub1,Term1):這意味着它是真實的,Term1(新的頭部)是真的,如果它是真的,則:

參數列表它是Term(舊參數列表的頭),其中如果Term == Sub ---> Term1 == Sub1

2)substlist(Sub,Terms,Sub1,Terms1)這意味着所有的子問題都解決了,我認爲這是一個重要的觀點,因爲參數列表Term是當前主函數F的參數列表,但可以包含其他它裏面的子函數和每個這些都代表了一個必須解決的問題,因爲在這一步中執行Sub - > Sub1替換。

但我不敢肯定這個最後一件事...

有人能幫助我深刻體會到它

TNX

安德烈

+1

拼寫檢查:適用於現代網頁瀏覽器,辦公室套裝(MS-Office,OpenOffice/LibreOffice)或獨立的命令行工具,例如'aspell'。 – 2013-04-13 13:45:29

回答

3

讓我說,它啓動如果你保持簡短的問題和重點,會很好。 Stackoverflow的整個想法是問題和答案稍後會對其他人有用,而編寫好的問題是其中很大的一部分。

繼續前進:所有的編程語言都有權利聲稱,程序的實際源代碼是對程序所做的最清晰,完整和詳盡的解釋(對人類而言)。 Prolog 絕對是有權利要求。它需要一些習慣,但很快一段寫得很好的謂詞確實會告訴更多關於程序邏輯的內容,而不是一種通常徒勞無益的嘗試,以固有含糊的自然語言給出精確的規範/定義,無論是英語,意大利語,還是甚至德語。

現在你的問題...

是什麼=../2辦?我們可能會看到here,但是,用幾句話,我們在左側有f(a,b, ..., x),在右側有[f, a, b, ..., x]

假設遞歸,列表,匹配和統一不需要在這裏解釋,您已經廣泛研究的程序,意大利語評論,並用英語向我們徹底解釋,做一件簡單的事情:所有出現的子項 in 期限被替換爲子目錄1期限1

這樣做是:

  • 通過直接替換簡單術語(原子)通過(使用=..)通過分解(形式f(Args))複雜的術語成一個列表匹配
  • ,然後施加算法遞歸地對該列表中的簡單術語(Args的元素)進行遞歸。後綴,列表重新組合,再次使用=..

所以,如果你有一個嵌套的名詞,你仍然可以得到:

?- substitute(x, f(g(h(x,y,z), h(k,l,m)), g(x,z)), q, T). 
T = f(g(h(q, y, z), h(k, l, m)), g(q, z)) ; 
false. 

這裏一個可能遇到的只有輕微的困難是substitutesubstlist是相互遞歸。如果這給了你很大的困難,你可以嘗試做的一件事就是從謂詞定義中刪除所有的註釋,立即將整個程序放在屏幕上(或者打印出來),然後看看它並思考它直到它有意義。有用!

+0

好吧,我可能已經太冗長了...我已經閱讀,閱讀並再次閱讀代碼,但是我仍然有疑問......當在子列表關係中以這種方式調用替代關係時:substitute(Sub,Term ,Sub1,Term1) 該程序正在調用通過它Sub是什麼需要被替換(如果它存在),Term(在哪裏搜索它),Sub1(什麼將取代Sub)和Term1是最終結果。我的疑問是如下:在這種情況下,Term是列表的頭部,所以它是一個單獨的元素(它是對的?)所以它會響鈴或規則1或規則2(與替代相關) – AndreaNobili

+0

但從來沒有規則3,因爲它是一個單一的元素,而不是一個清單......是不是?或者我失去了什麼? – AndreaNobili

+1

如果我理解你的問題:是的,_Term_是列表的頭部,但它可以是一個函數(所以它可能看起來像'f(a,b,...,x)')。所以可以預料'substitute/4'的第三個子句將會匹配。爲什麼不試圖追蹤形式爲'? - substitute(x,f(g(h(x,y,z),h(k,l,m)),g(x,y)) ,q,F)。' – 2013-04-13 15:47:49