私が理解していることから、宣言型パラダイムは、解決策に到達する方法ではなく、解決策に到達するために何が重要かを示していますが、手続き的に考えることに慣れているため、しばしば混乱します...
したがって、解決策は次のとおりです。
mymember(X, [X|_]).
mymember(X,[_|T]) :- mymember(X,T).
これは、この単純なプログラムの宣言的な解釈です。
1) X がこのリストのヘッドであることが TRUE の場合、X はリストに属します(リストのヘッド要素がX 要素と統合されている場合、リスト内にあるかどうかがわかります)
2) 最初の事実が真でない場合 (X が最初のリスト要素と一致しない場合)、プログラムは 2 番目のルールを実行しようとします (おそらく、ここで解釈の問題があるかもしれません)。このルールは次のように述べています: ルールの本体が true の場合、ヘッドは true です)
ルールの頭は次のように言います: X はリストの TAIL に属します (リストの最初の要素を気にしないことを示すために_文字を使用して無名変数を使用します)
X 要素がリストの末尾に属していることが TRUE である場合、X 要素が先頭のないリストに属していることは TRUE です。
このプログラムの正しい宣言的および論理的解釈ですか、それとも何か不足していますか?