0

我试图定义一个回文数,其中 a 的数量比 b 的数量少一。我似乎无法弄清楚如何正确编写它

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

2 回答 2

0

想一想:剩余的“b”可以留在哪里?在回文中,只有一个这样的地方。然后更改对称定义,在 BNF 中(您已经知道转换为 DCG)将读取

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

你在正确的轨道上,你只需要一种方法来处理计数差异。您可以通过在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).
于 2014-06-21T23:21:01.970 回答