a の数が b の数より 1 少ない回文を定義しようとしています。正しい書き方が思い浮かばない
please-->palindromes.
palindromes-->[].
palindromes-->[a].
palindromes-->[b].
palindromes--> [b],palindromes,[b].
a の数が b の数より 1 少ない回文を定義しようとしています。正しい書き方が思い浮かばない
please-->palindromes.
palindromes-->[].
palindromes-->[a].
palindromes-->[b].
palindromes--> [b],palindromes,[b].
これについて考えてみてください: 余剰 'b' はどこにとどまることができますか? 回文では、そのような場所は 1 つだけです。次に、対称定義を変更します。BNF (DCG に変換することは既にわかっています) では次のようになります。
S :: P
P :: a P a | b P b | {epsilon}
カウントの違いに対処する方法が必要なだけです。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)
が である、指定されたアルファベットの回文を意味するとします。基本ケースについては、次のことを正確に知っています。b
a
Diff
Diff
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).