宣言的推論に参加するにはいくつかの問題があります...だから、私の推論が正しいかどうか、何か間違っているかどうか、または何かが足りないかどうかを尋ねるためにここにいます...
次の問題があります:リストの要素を反転する Prolog プログラムを作成する
たとえば、次のようなものを呼び出す場合:
myreverse([a,b,c,d,e],X)。X=[e,d,c,b,a] を取得する必要があります
私は次の解決策を持っています:
naiverev([],[]).
naiverev([H|T],R):- naiverev(T,RevT),
append(RevT,[H],R).
これは私の解釈です:
空のリストの逆は空のリストであるという事実があります。
最初のリストが空でない場合は、真ではないという事実とそうでないという事実が一致するため、次のルールに進みます。
ルールは次のように述べています: リスト R がリスト [H|T] の逆数であることを証明するプログラム
次の方法で、論理的な意味を右から左に読むことができます。
naivrev(T, RevT) AND append(RevT, [H], R) ---> naivrev([H|T],R) が TRUE の場合
したがって、(ルールの本文では) 「関数」naivrev(T,RevT)は、RevT が T の逆数の場合に TRUE を応答し、それ以外の場合は FALSE を応答すると想定しています。
同時に、**append(RevT,[H],R)は、R が [H|RevT] の場合に TRUE を応答し、それ以外の場合は FALSE を応答すると想定しています。
次に、ルール本体の両方の部分が TRUE の場合、プログラムは HEAD が TRUE であると推測できます (この場合、R は [H|T] の逆数です)。
この推論は良いですか、それとも何か不足していますか?