我试图定义一个回文数,其中 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 规则,实现 " Bis 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).