让我们以连词为例:A ∧ B
.
如果我们知道A
和B
,我们可以推断A ∧ B
:
A B
------- I
A ∧ B
这称为引入规则。
对偶,如果我们知道A ∧ B
我们可以推断A
, 或B
:
A ∧ B A ∧ B
------- E1 ------- E2
A B
这些是淘汰规则。
然后,如果我们知道A
我们可以证明 A
首先使用引入规则进行推导A ∧ A
,然后使用排除规则将其分解为A
(和另一个A
):
A A
------- I
A ∧ A
-------- E1
A
而这种迂回可以出现在较大的样张中。
没有理由进行这次往返:我们在开始的地方结束了!
后续演算“禁止”排除规则之后的引入规则。Gentzen 的结果表明,具有此属性的逻辑与允许引入规则之后的消除规则的逻辑一样强。如今这很重要,因为证明的空间要小得多:首先我们消除(尽可能/需要尽可能小的公式),然后我们引入(建立目标)。这实际上很有用,例如,对于自动证明搜索或程序合成。
编辑这个答案的第一个版本有证据证明A ∧ B
:
A ∧ B A ∧ B
------- E1 ------- E2
A B
----------------- I
A ∧ B
然而,除了直接证明:
A ∧ B
-------- ID A ∧ B
它似乎是唯一的其他“简单证明”。在 Haskell 语法中,人们会这样写:
proof :: (a, b) -> (a, b)
proof (x, y) = (x, y)
-- or
proof x = x
proof = id
哪些是相同的(除了严格属性,逻辑不感兴趣),并且是唯一合理的定义。例如:
proof :: (a, b) -> (a, b)
proof x = fst (x, x)
也是有效的,不再聪明了。