我试图定义一个回文数,其中 a 的数量比 b 的数量少一。我似乎无法弄清楚如何正确编写它
please-->palindromes.
palindromes-->[].
palindromes-->[a].
palindromes-->[b].
palindromes--> [b],palindromes,[b].
我试图定义一个回文数,其中 a 的数量比 b 的数量少一。我似乎无法弄清楚如何正确编写它
please-->palindromes.
palindromes-->[].
palindromes-->[a].
palindromes-->[b].
palindromes--> [b],palindromes,[b].
想一想:剩余的“b”可以留在哪里?在回文中,只有一个这样的地方。然后更改对称定义,在 BNF 中(您已经知道转换为 DCG)将读取
S :: P
P :: a P a | b P b | {epsilon}
你在正确的轨道上,你只需要一种方法来处理计数差异。您可以通过在palindromes
语法术语中添加数字参数来做到这一点。
首先,我将定义一个普通的 Prolog 规则,实现 " B
is two more than 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).