使用CFG进行乘法运算

时间:2014-10-21 04:15:59

标签: math context-free-grammar context-free-language

我正在尝试制作一个与以下功能相同的CFG。我知道B是循环计数器,所以它可以是一系列被压入堆栈的元素,每次循环完成时,弹出B中的元素,如果B = Epsilon退出。如何在while循环的上半部分处理添加?

PROCEDURE multiply a, b;
VAR a, b, z;
BEGIN
z := 0;
  WHILE b > 0 DO BEGIN
        z := a + z;
        b := b - 1;
  END
  RETURN z;
END;

1 个答案:

答案 0 :(得分:0)

你无法用CFG做到这一点,尽管你当然可以用CSG做到这一点。泵浦引理应该足以证明是不可能的。

如果b已修复,则很容易:

S ⇒ ε
S ⇒ 0 S 1 1 … 1
       (b times)

这将识别形式的字符串

0a1a·b

这是我能想到的唯一一种CFG可以实现乘法的感觉。