このプログラムの前に、要素 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).
私は前の例のようなことをしようとしていて、それをより話す論理形式に翻訳しようとしています。
このルールの背後にあるロジックは何ですか? どういう意味ですか?