私はPrologを初めて使用し、大学の試験のために勉強しています。SWIPrologを使用しています。
リストSがリストLのサブリストである場合にTRUEと表示されるこの単純なプログラムがどのように機能するかを理解するには、問題があります。それ以外の場合は、述語がFALSEと表示されます。
私は次の解決策を持っていますが、それが宣言的な意味を理解するのにいくつかの問題があります
この本を読んで、私はいくつかの考えを持っていたと思いますが、それについてはよくわかりません...
これは、連結を使用するソリューションです。
sublist(S,L) :- conc(L1, L2, L),
conc(S, L3, L2).
conc([],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
このソリューションは、3番目のリストが最初のリストと2番目のリストの連結である場合にTRUEに応答する他の小さなプログラムを使用します。
LのSiサブリストがTRUEである必要がある場合、次の2つの条件があります。
- Lは、L1とL2を連結したリストである必要があります
- L2は、 S(Lリストに存在する場合は私のサブリスト)と別のリストL3を連結したリストである必要があります。
これは本の説明ですが、私にとってはほんの少しの難解です...
私はそれについて推論し、本当に深く意味することを理解しようとしました...
したがって、ある意味では、この他のプログラムを使用して、要素がリストのメンバーであるかどうかを検索するようなものだと思います。
member2(X, [X|_]).
member2(X,[_|T]):- member2(X,T).
このプログラムでは、Xがリストの一番上(その先頭)の要素である場合、Xはリストにあり、プログラムはtrueと応答します。それ以外の場合、X要素がリストの一番上にない場合(またはそれが私の解決策ではない場合)、このリストのTAILTで検索しようとします。
サブリストプログラムに戻る理由は似ていると思います
まず、Lリストを2つのリストL1とL2に分解します(concプログラムを使用)**
次に、SとL3の連結がL2リストであることが正しいかどうかを確認します。
ブースこれらの条件が真である場合、SはLのサブリストです
L1リストには、メンバープログラムのリストから抽出したX要素と同様の役割があると思います。
サブリストSはリストLの先頭から開始できるため、L1は[]になり、L1 = []とL2の連結でLを分解でき、SとL3でL2を分解できるようになります。
この最後の分解を行うことができれば、プログラムは終了し、Sが元のリストLのサブリストであることは事実であると言えます。
conc(S、L3、L2)が正しくない場合は、ddoをバックトラックして、他の計算ブランチを実行します。
私の宣言的解釈は正しいですか?
私はこの例で大きな困難を見つけています、私は手続き型の説明も見つけようとしました(Prologシェルの操作トレースを使用して)が、計算が非常に大きいため、短いリストでも大きな問題があります...