私はpalindrome/1
、そのリスト入力が回文リストで構成されている場合にのみ真である述語をPrologに書き込もうとしています。
例えば:
?- palindrome([1,2,3,4,5,4,3,2,1]).
本当です。
アイデアや解決策はありますか?
私はpalindrome/1
、そのリスト入力が回文リストで構成されている場合にのみ真である述語をPrologに書き込もうとしています。
例えば:
?- palindrome([1,2,3,4,5,4,3,2,1]).
本当です。
アイデアや解決策はありますか?
回文リストは、同じものを逆方向に読み取るリストであるため、リストを逆にして、同じリストが生成されるかどうかを確認できます。
palindrome(L):-
reverse(L, L).
誰もがリバース/2ベースのソリューションに投票しているようです。皆さんは、与えられたリストのO(n)であるreverse/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システムのprofileコマンドを介していくつかの小さな統計を行いましょう。結果は次のとおりです。
したがって、DCGソリューションは、ポジティブケース(「レーダー」)の方が高速であることが多く、リバースリスト全体を作成する必要はありませんが、直接中央に移動し、独自の再帰を残して残りをチェックします。ただし、DCGソリューションの欠点は、決定論的ではないことです。いくつかの時間測定はもっと教えてくれるでしょう...
さよなら
PS:Jekejeke Prologの新しいプラグ可能なデバッガーで行われたポート統計:
http ://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_dev/10_docu/02_reference/04_examples/02_count.html
しかし、他のPrologシステムにも同様の機能があります。詳細については、「コードプロファイラー」列を参照してください:http:
//en.wikipedia.org/wiki/Comparison_of_Prolog_implementations
これは確かに宿題の質問のように聞こえますが、私は自分自身を助けることはできません:
palindrome(X) :- reverse(X,X).
技術的には、プロローグファンクターは何も「返しません」。
別の方法として、DCGでそれを行う:
palindrome --> [_].
palindrome --> [C,C].
palindrome --> [C],palindrome,[C].
次のような回文を確認できます。
?- phrase(palindrome,[a,b,a,b,a]).
true.
?- phrase(palindrome,[a,b,a,b,b]).
false.
あなたが使用することができます:
palindrome([]).
palindrome([_]).
palindrome([X|Xs]):-append(Xs1,[X],Xs), palindrome(Xs1).