我正在尝试定义一个回文数,其中a的数量比b的数量少一个。 我似乎无法弄清楚如何正确地写它
please-->palindromes.
palindromes-->[].
palindromes-->[a].
palindromes-->[b].
palindromes--> [b],palindromes,[b].
答案 0 :(得分:0)
想一想:剩余的'b'可以留在哪里?在回文中,只有一个这样的地方。然后更改对称定义,在BNF中(您已经知道翻译为DCG)将读取
S :: P
P :: a P a | b P b | {epsilon}
答案 1 :(得分:0)
你走在正确的轨道上,你只需要一种方法来处理数量上的差异。您可以通过在palindromes
语法术语中添加数字参数来完成此操作。
首先,我将定义一个普通的Prolog规则,实现“B
比A
多两个”:
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).