0

a の数が b の数より 1 少ない回文を定義しようとしています。正しい書き方が思い浮かばない

   please-->palindromes.
   palindromes-->[].
   palindromes-->[a].
   palindromes-->[b].
   palindromes--> [b],palindromes,[b].
4

2 に答える 2

0

これについて考えてみてください: 余剰 'b' はどこにとどまることができますか? 回文では、そのような場所は 1 つだけです。次に、対称定義を変更します。BNF (DCG に変換することは既にわかっています) では次のようになります。

S :: P
P :: a P a | b P b | {epsilon}
于 2013-05-09T06:19:22.270 に答える
0

カウントの違いに対処する方法が必要なだけです。palindromesこれを行うには、文法用語に数値引数を追加します。

B最初に、" is two more than A"を実装する通常の Prolog ルールを定義します。

plus2(A,B) :- number(A), !, B is A+2.
plus2(A,B) :- number(B), !, A is B-2.
plus2(A,B) :- var(A), var(B), throw(error(instantiation_error,plus2/2)).

次に、文字数から文字数を引いたものpalindromes(Diff)が である、指定されたアルファベットの回文を意味するとします。基本ケースについては、次のことを正確に知っています。baDiffDiff

palindromes(0) --> [].
palindromes(-1) --> [a].
palindromes(1) --> [b].

再帰的な文法規則の場合、{中かっこ内のコード ブロックを使用して述語}をチェックできます。plus2

palindromes(DiffOuter) --> [b], palindromes(DiffInner), [b],
    { plus2(DiffInner, DiffOuter) }.
palindromes(DiffOuter) --> [a], palindromes(DiffInner), [a],
    { plus2(DiffOuter, DiffInner) }.

最後に、最上位の文法規則は次のとおりです。

please --> palindromes(1).
于 2014-06-21T23:21:01.970 に答える