-1

私は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

アンドレア

4

1 に答える 1

3

まず、質問を短く、要点を絞っていただければ幸いです。Stackoverflow の全体的な考え方は、質問と回答が後で他の人に役立つということであり、良い質問を書くことはこれの大きな部分です。

先に進む: すべてのプログラミング言語には、プログラムの実際のソース コードが、プログラムが何をするかについて (人間にとって) 最も明確で、完全で、網羅的な説明であると主張する権利があります。プロローグは間違いなくその主張の権利を持っています. 慣れるには少し時間がかかりますが、すぐによく書かれた述語は、本質的にあいまいな自然言語で正確な仕様/定義を提供しようとする無駄な試みよりも、プログラムのロジックについてより多くのことを伝えます。英語、イタリア語、さらにはドイツ人。

今あなたの質問に...

何をし=../2ますか?ここに見えるかもしれませんが、簡単に言えば、f(a,b, ..., x)左側と[f, a, b, ..., x]右側にあります。

再帰、リスト、マッチング、および単一化についてここで説明する必要はないと仮定すると、あなたが広範囲に研究し、イタリア語でコメントし、英語で徹底的に説明したプログラムは、1 つの単純なことを行います。 Term1Subterm1

これは行われます:

  • 単純な用語 (アトム) をマッチングによって直接置き換えることによって
  • 複雑な用語 ( の形式) をリストに分解し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が相互に再帰的であることです。これが非常に困難な場合は、述語定義からすべてのコメントを削除し、プログラム全体を一度に画面に合わせて (または印刷して)、それを見て考えてみることができます。意味がわかるまで。できます!

于 2013-04-13T13:12:18.533 に答える