2

このプログラムの前に、要素 X が文字列 L に属しているかどうかを示す次の例を見てきました。

この例のコードは次のとおりです。

member2(X, [X|_]).
member2(X,[_|T]):- member2(X,T).

基本ケース (X 要素がリストの先頭にある場合はリストに属します) を表す 1 つの事実があり、要素 X が先頭でない場合は、ルールを使用してリストの末尾を再帰的に検索します。 ..

このバージョンは私にはかなりわかりにくかったので、どのように機能するかを理解するために、この方法で見るように勧められました。

member2(X, [X|_]).
member2(X,Y):- Y = [_|T],
               member2(X,T).

したがって、意味はより明確です。

基本ケースを表すファクトが 1 つあります (リストの先頭にある場合、X 要素はリストに属します)。

規則では、次の 2 つのことを証明する必要があります。

1) Y = [_|T] 無名変数 _ は何でも統一するので、これは真です。

2) テールリストの要素 X を再帰的に検索します

さて、この新しい課題を理解するには問題があります。2 つの文字列を指定して、2 番目の文字列を 3 番目の文字列の最初の文字列に連結する SWI Prolog プログラムを作成する必要があります。

解決策は次のとおりです。

myappend([], L, L).
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).

私はそれがどのように機能するかを理解するのにいくつかの問題があります

私は事実が基本ケースを表していることを理解しています: 最初のパラメータが無効なリスト [] であり、2 番目のパラメータが無効でないリストである場合、最初のパラメータと 2 番目のパラメータの連結は 2 番目のパラメータ リストです (これは3 番目のパラメーター)

このルールは、最初のパラメーターが無効なリストではない一般的なケースを表しています...したがって、このケースが発生した場合、これが空のリストになるまで L1 パラメーターの先頭 (最初のリストの先頭) を削除すると思います [] 、したがって、基本ケースがあり、3 番目のパラメーターが 2 番目のパラメーターに統合されます...その後、バックトラックを行います...

しかし、ルールがどのように機能するかを理解するのに問題があります。

myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).

私は前の例のようなことをしようとしていて、それをより話す論理形式に翻訳しようとしています。

このルールの背後にあるロジックは何ですか? どういう意味ですか?

4

2 に答える 2

1
myappend([], L, L).

myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).

2 番目の規則の長いバージョン:

myappend(L1, L2, Concat) :- 
    L1 = [HeadL1|RestL1], Concat = [HeadConcat|RestConcat], 
    HeadL1 = HeadConcat,
    myappend(RestL1,L2,RestConcat).

最初の規則は、最初のリストが空の場合、連結されたリストは 2 番目のリストと同じであることを意味します。

2 番目の規則は、最終的なリストが最初の list の最初の要素と、最初の listの残りと 2 番目の listを連結Xしたリストによって形成されることを意味します。最初の引数は、 による制約により、それがリストで空でない場合にのみ統合できることに注意してください。LL1L2[X|L1]

述語は、第 1 引数、第 2 引数、第 3 引数が第 1 引数と第 2 連結の関係にあるかどうかをテストするものと考えることができます。Prolog でリストの先頭要素を抽出するのは簡単かつ効率的であるため、上記のソリューションは最初の要素を選択し、それらを一致させ ( [X|L1]and [X|L])、残りの要素が連結関係を満たすことをテストします。

于 2012-12-20T15:04:03.577 に答える
-1

連結([ ],L,L)。

連結 ( [X | L1 ], L2, [ X | L ] ):- 連結 ( L1, L2 , L).

ここでは、既存のリストの最後に要素/リストを追加しています。

Concatenate(既存のリスト、要素、[既存のリスト|要素])

1 -> リストが空の場合、連結リストは 2 番目のリストになります。2 番目のステートメントの例: 既存のリスト = [1,2]
要素 3 の追加

Concatenate([X|L1], L2, [X|L]):- 連結 (L1, L2, L)。

連結 ([1|2]、3、[1|x]):-

連結 ([2],3,[2|y]):- (x= [2|y];)

([], 3, 3) を連結します。(y = 3;)

したがって、最終的なリストは [1,2,3] になります。

于 2017-11-27T01:15:19.870 に答える