#P7062. [NWRRC 2014] Combinator Expression
[NWRRC 2014] Combinator Expression
Description
题目背景
组合逻辑可以看作是一种计算模型,允许将任何可计算函数表示为从小的有限基底中选取的函数的组合。在这个问题中,我们考虑 BCKW 基底的一个受限变体,即 BCKI。
BCKI 基底中的组合表达式是一个字符串,对应于以下文法:
⟨表达式⟩ ::= ⟨表达式⟩ ⟨项⟩ | ⟨项⟩
⟨项⟩ ::= ‘(’⟨表达式⟩‘)’ | ‘B’ | ‘C’ | ‘K’ | ‘I’
从文法可以看出,表达式是应用树,叶子是组合子 和 。应用是左结合的。例如, 等价于 ,但不等价于 。
为了便于解释,我们将使用小写英文字母 来表示子表达式。这些小写字母不会出现在实际数据中。例如, 可以表示为 (即 ),,,$Bxy (B\underbrace { I }_{ x }\underbrace { C }_{ y })$,但不能表示为 。
在表达式 中,我们说将 应用于 。我们可以用直觉来理解, 是一个函数,而 是它的参数。然而,求值过程与传统的计算非常不同——不是通过固定表达式树传递值,而是通过改变树结构,使得结果也是一个组合表达式。
为了求值一个表达式,我们需要选择一个子表达式,该子表达式应符合下表中的某个模式——也就是说,应该存在这样的 (可能还有 和 ),使得表中的模式与子表达式相等。然后我们需要将子表达式替换为表中的简化结果。
| 模式 | 简化结果 | 描述 |
|---|---|---|
| 组合函数(Zusammensetzungsfunktion) | ||
| 交换函数(Vertauschungsfunktion) | ||
| 常数函数(Konstanzfunktion) | ||
| 恒等函数(Identitätsfunktion) |
替换完成后,我们必须重复这个过程,直到没有合适的子表达式为止。这个最终表达式就是原始表达式的规范形式。例如,在表达式 中,我们可以进行如下字母分配
$$\underbrace { C }_{ C }\underbrace { I }_{ x }\underbrace { C }_{ y }\underbrace {(CB)}_{ z }I$$并看到 包含了 组合子模式,因此简化为
$$(\underbrace { C }_{ C }\underbrace { I }_{ x }\underbrace { C }_{ y }\underbrace { (CB) }_{ Z })I \rightarrow (\underbrace { I }_{ x } \underbrace {(CB)}_{ z }\underbrace { C }_{ y })I$$另一个例子: 表达式。让我们先简化组合子
$$(\underbrace { B }_{ B }\underbrace { ((CK)I) }_{ x }\underbrace { I }_{ y }\underbrace { C }_{ z } \rightarrow \underbrace { ((CK)I) }_{ x } (\underbrace { I }_{ y }\underbrace { C }_{ z }))$$现在,让我们简化最后一个
$$((CK)I)(\underbrace { I }_{ I } \underbrace { C }_{ x }) \rightarrow ((CK)I)C$$最后,我们通过两次更多的简化完成求值:
$$((\underbrace { C }_{ C }\underbrace { K }_{ x }) \underbrace { I }_{ y }) \underbrace { C }_{ z } \rightarrow (\underbrace { K }_{ K }\underbrace { C }_{ x }) \underbrace { I }_{ y } \rightarrow C$$可以证明,无论求值顺序如何,规范形式都是一样的。例如,以下求值顺序:
$$C(K(II)(\underbrace { I }_{ I }\underbrace { C }_{ x })) \rightarrow C(K(\underbrace { I }_{ I }\underbrace { I}_{ x })(C)) \rightarrow C((\underbrace { K }_{ K }\underbrace { I }_{ x }) \underbrace { C }_{ y }) \rightarrow CI$$和
$$C(K(\underbrace {I}_{ I }\underbrace { I }_{ x })(IC)) \rightarrow C((\underbrace { K }_{ K }\underbrace { I }_{ x })\underbrace { (IC)}_{ y }) \rightarrow CI$$得到的结果相同。然而,如你所见,简化的次数不同:第一个情况下为 次,第二个情况下为 次。这提出了一个有趣的问题——找到一个给定公式所需的最小简化次数。
你的任务是编写一个程序,找到给定组合表达式求值到其规范形式所需的最小简化次数。
Input Format
输入文件只有一行,包含一个符合上述文法的组合表达式。表达式的长度不超过 。表达式中不含空格或文法未指定的符号。
Output Format
输出一个整数——给定公式求值到规范形式所需的最小简化次数。
C(K(II)(IC))
2
CIBI
3
BBBBBCCCCCKKKKKIIIII
15
Hint
时间限制:1 秒,内存限制:256 MB。
京公网安备 11011102002149号