Prologに述語palindrome/1
を書き込もうとしていますが、リスト入力が回文リストである場合にのみ真です。例えばProlog - Palindrome Functor
:
?- palindrome([1,2,3,4,5,4,3,2,1]).
が真です。
アイデアや解決策はありますか?
Prologに述語palindrome/1
を書き込もうとしていますが、リスト入力が回文リストである場合にのみ真です。例えばProlog - Palindrome Functor
:
?- palindrome([1,2,3,4,5,4,3,2,1]).
が真です。
アイデアや解決策はありますか?
は、誰もが逆/ 2ベースのソリューションに投票されていることを検索します。私はあなたの人は、指定されたリストのO(n)であることを念頭に置いて、逆/ 2の解を持つと思います。アキュムレータで何か:
reverse(X,Y) :- reverse(X,[],Y).
reverse([],X,X).
reverse([X|Y],Z,T) :- reverse(Y,[X|Z],T).
しかし、回文をチェックする他の方法もあります。私はDCGを利用するソリューションを考え出しました。次のルールを使用できます。
palin --> [].
palin --> [_].
palin --> [Border], palin, [Border].
どのソリューションが優れていますか?さて、Prologシステムのプロファイル のコマンドを使って、少しの統計をすることができます。ここでの結果は以下のとおりです。
はDCGソリューションが正の場合(「レーダー」)で、多くの場合、高速であるので、多分、それは は全体の逆リストを作成する必要はありませんが、直接、真ん中に移動します はそれ自身の再帰を残している間に残りをチェックします。しかし、DCGソリューション の欠点は、それが非確定的であることです。
http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_dev/10_docu/02_reference/04_examples/02_count.html
は、しかし、他のPrologシステムは、同様の機能を持っている:いくつかの時間の測定が
さようなら...
P.S:Jekejekeプロローグの新しいプラグ可能なデバッガで行うポートの統計情報をより多くを言うだろう。 DCGのでそれをやって、
http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations
私は分かりませんが、CERFを数えることは適切ではないので、逆が原始的である場合があります。そして、OPがPrologには新しいように聞こえてきたので、それはまったく新しい構文を彼/彼女に投げることを意味しているようです:)。しかし、トピックに素敵な追加、。 –
チェック詳細については、 "コードプロファイラー" 欄を参照してくださいこの解決策
palin(L):- palin(L,[]).
palin(L,L).
palin([_|T],T).
palin([H|T],list):- palin(T,[H|list]).
あなたはそれを削除することができます自分自身? - okの質問が編集されました。元々は "これを削除してください"と言いました... –
申し訳ありませんが、この質問には回答があり、削除することはできません。 – Amjad