5

私はpalindrome/1、そのリスト入力が回文リストで構成されている場合にのみ真である述語をPrologに書き込もうとしています。

例えば:

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

本当です。

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

4

5 に答える 5

9

回文リストは、同じものを逆方向に読み取るリストであるため、リストを逆にして、同じリストが生成されるかどうかを確認できます。

palindrome(L):-
  reverse(L, L).
于 2011-12-29T15:29:56.987 に答える
8

誰もがリバース/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

于 2011-12-29T18:27:28.813 に答える
4

これは確かに宿題の質問のように聞こえますが、私は自分自身を助けることはできません:

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

技術的には、プロローグファンクターは何も「返しません」。

于 2011-12-29T15:29:37.017 に答える
1

別の方法として、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.
于 2014-06-21T13:32:08.673 に答える
1

あなたが使用することができます:

palindrome([]).
palindrome([_]).
palindrome([X|Xs]):-append(Xs1,[X],Xs), palindrome(Xs1).
于 2019-01-06T20:00:55.513 に答える