私はSWI Prologを使用して大学の大学試験のためにPrologを学んでい ます.univ =.. =..
述語を使用してフルムラ式の記号操作を実行するこの演習が どのように機能するかについて疑問があります。表現。
次の関係を定義して実行します。
substituite(サブターム、ターム、サブターム1、ターム1)
Term1 rappresent が、SubTerm のすべての出現箇所が SubTerm1 で置換されている Term 式を表す場合は TRUE です。
たとえば、私が持っている場合:
substituite(sin(x), 2*(sin(x)), t, F)。
F = 2*t*f(t)すべての sin(x) オカレンスが t で置換されるため
これが解決策です(Bratkoの本に見つかりました)が、私の解釈についてはよくわかりません:
% 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 = Termである特定のケースを表しているため、最終的なTerm1=SubTerm1 です(すべての用語を置換するため) 。
2 番目の規則rappresentは、 Term がアトムである特定のケースを表すため、SubTerm と SubTerm1 の値に関係なく、置換は実行しません。
ここまでは単純で、私の推論は正しいと思います...その次に、より難しい部分が始まりますが、よくわかりません...
ルール:
substitute(Sub, Term, Sub1, Term1) :-
Term =.. [F|Args],
substlist(Sub, Args, Sub1, Args1),
Term1 =.. [F|Args1].
rappresent は、 Termで表される式rappresented 、Sub で 表されるその可能な部分式rappresented 、 Subの出現に遭遇したときに最終的に置換される必要がある新しい部分式Sub1 、およびTerm 式を rappresentする式Term1を持つ一般的なケースを表します。 SubTerm の出現箇所はすべて SubTerm1 に置き換えられます。
だから私はこの方法で宣言的にそれを読むことができ ます:
次の事実が TRUE である場合、Term1 rappresentは、SubTerm のすべての出現箇所が SubTerm1 で置換される Term 式を表すことが TRUEです。
1) 元の式Termは、ヘッドにメイン ファンクター F (式の評価で実行される最初の演算子) と、後でこのファンクター Fの引数を表すサブリスト Argsを持つリストに分解できます(私は、場合によっては、Args には、この計算ステップではメインのファンクターではない他のファンクターも含めることができます...そのため、これらの場合、解決すべき副問題がまだいくつかあります)
2) substlist(Sub, Args, Sub1, Args1) は true です。これは、Args1 rappresent Args で、すべての引数が Sub subexpression に等しい場合、Sub1 subexpression に置き換えられることが true であることを意味します。
3) 最後に、新しい Term1 は、メイン ファンクター F と新しい引数リスト Args1 の間の univ =.. 述語の結果であることが真でなければなりません( = ..メインファンクター 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).
そして、これは私にとって理解するのがより難しい部分です。私はそれを次のように、宣言的な読み方で見ています。
[Term1|Terms1] rappresent 引数のリスト [Term|Terms] で、すべての Sub term が Sub1 に置き換えられるのは、次のことが true の場合です。
1) replacement(Sub, Term, Sub1, Term1): これは、Term1 (新しい引数リストの先頭) が Term (古い引数リストの先頭) であることが TRUE であることを意味し、Term == Sub の場合 -- -> Term1 == Sub1
2) substlist(Sub, Terms, Sub1, Terms1) は、すべての部分問題が解決されたことを意味します。引数リストTermは現在のメイン ファンクター F の引数リストですが、内部に他のサブ ファンクターを含めることができるため、これは重要なポイントだと思います。それとこれらのそれぞれは、このステップで Sub-->Sub1 置換を実行する前に解決しなければならない副問題を提示します。
しかし、この最後のことについてはよくわかりません...
誰かが私がそれを深く理解するのを助けることができます
TNX
アンドレア