我使用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當您遇到Sub和Term1的出現時,最終應該被替換,該替換表示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
安德烈
拼寫檢查:適用於現代網頁瀏覽器,辦公室套裝(MS-Office,OpenOffice/LibreOffice)或獨立的命令行工具,例如'aspell'。 – 2013-04-13 13:45:29