2011-12-29 6 views
3

Prologに述語palindrome/1を書き込もうとしていますが、リスト入力が回文リストである場合にのみ真です。例えばProlog - Palindrome Functor

?- palindrome([1,2,3,4,5,4,3,2,1]). 

が真です。

アイデアや解決策はありますか?

+0

あなたはそれを削除することができます自分自身? - okの質問が編集されました。元々は "これを削除してください"と言いました... –

+0

申し訳ありませんが、この質問には回答があり、削除することはできません。 – Amjad

答えて

6

回文リストは、あなたはそれが同じリストを生成するかどうかを確認するために、リストを逆にすることができますので、逆方向に同じことを読み込むリストである:

palindrome(L):- 
    reverse(L, L). 
+0

ありがとう...だから、基本的には.plファイルを作成してこの述語をGNUプロローグに問い合わせてください。右? – Amjad

+1

これは正しい – gusbro

+0

ありがとう!わかった。 :D – Amjad

5

宿題の質問のように、この確認音が、私はちょうど自分自身を助けることはできません。

palindrome(X) :- reverse(X,X). 

技術的には、プロローグファンクタは何も「戻る」はありません。

+0

それは「はい」と正しく返されますか? – Amjad

+0

Prologは "yes"と応答し、クエリが正常に満たされたことを示します。また、このプログラムを読み込むには、プロンプトから直接(assertを使用して)行うことができますが、ファイルに入れてそのファイルを参照するほうがずっと簡単です。 –

+0

ありがとう!今、私は分かる! :D – Amjad

7

は、誰もが逆/ 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システムのプロファイル のコマンドを使って、少しの統計をすることができます。ここでの結果は以下のとおりです。

Port Statistics

は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

+2

私は分かりませんが、CERFを数えることは適切ではないので、逆が原始的である場合があります。そして、OPがPrologには新しいように聞こえてきたので、それはまったく新しい構文を彼/彼女に投げることを意味しているようです:)。しかし、トピックに素敵な追加、。 –

1

別の方法:

palindrome --> [_]. 
palindrome --> [C,C]. 
palindrome --> [C],palindrome,[C]. 

をあなたはこのような回文かどうかを確認することができます

?- phrase(palindrome,[a,b,a,b,a]). 
true. 

?- phrase(palindrome,[a,b,a,b,b]). 
false. 
+1

なぜこれらの問題? – false

+1

@falseなぜ私はそれらを書きましたか分かりません。削除されました。 – rpax

0

チェック詳細については、 "コードプロファイラー" 欄を参照してくださいこの解決策

palin(L):- palin(L,[]). 

palin(L,L). 
palin([_|T],T). 
palin([H|T],list):- palin(T,[H|list]).