如果我正确地理解了Curry-Howard的同构,每个依赖类型都对应一个定理,实现它的程序就是一个证明。这意味着任何数学问题,例如a^n + b^n = c^n
,都可以某种方式表示为一种类型。
现在,假设我想设计一个生成随机类型(定理)的游戏,并且游戏必须尝试实现这些类型的程序(证明)(定理)。是否有可能控制那些定理的难度?即,简单模式会产生平凡的定理,而硬模式会产生更难的定理。
答案 0 :(得分:3)
单向函数是一个可以在多项式时间内计算的函数,但它没有可以在多项式时间内计算的右逆。如果f
是单向函数,那么您可以选择一个参数x
,其大小由难度设置决定,计算y = f x
,并要求用户建设性地证明y
位于f
。{/ p>的图像中
这不是非常简单。没有人知道是否有任何单向函数。大多数人认为有,但证明,如果确实如此,至少与证明P /= NP
一样困难。但是,有一丝光芒!人们设法用奇怪的属性构造函数,如果任何函数是单向的,那么这些函数必须是单向的。所以你可以选择这样一个功能,并相信你会提供足够多的难题。不幸的是,我相信所有已知的通用单向函数都非常讨厌。因此,您可能会发现很难对其进行编码,您的用户可能会发现即使是最简单的证据也太难了。因此,从实际的角度来看,你可能最好选择加密哈希函数这样的东西,这种函数不是真正单向的,但对于人来说肯定很难破解。 / p>
答案 1 :(得分:1)
如果只生成类型,则大多数类型将与⊥
同构。 ∀ n m -> n + m ≡ m + n
有意义,但∀ n m -> n + m ≡ n
,∀ n m -> n + m ≡ suc m
,∀ n m -> n + m ≡ 0
,∀ n m xs -> n + m ≡ length xs
和其他数百万不是。您可以尝试生成类型良好的术语,然后使用像Djinn之类的东西检查生成的术语的类型不是由更简单的术语居住。然而,即使使用clever strategy,许多生成的术语也会过于简单或只是无意义的垃圾。键入的设置包含的术语少于非键入的设置,但只有一个变量的类型可以是A
,A -> A
,A -> B
,B -> A
,A -> ... -> E
和所有这些类型变量可以是免费的或普遍量化的。此外,∀ A B -> A -> B -> B
和∀ B A -> A -> B -> B
基本上是相同的类型,所以你的平等不仅仅是αη,而是更复杂的东西。搜索空间太大了,我怀疑随机生成器可以产生非常重要的东西。
但也许某些特定形式的术语可能很有趣。 Bakuriu 在评论中提出了由参数性提供的定理:您可以简单地从{Agard标准库中取Data.List.Base
或Function
或任何其他基本模块,并凭空创建许多定理。还要查看A computational interpretation of parametricity论文,该论文提供了一种从依赖类型设置中的类型推导定理的算法(但是,我不知道它与Theorems for free的关系如何,并且它们没有给出数据规则类型)。但我不确定大多数产生的定理是不是可以通过简单的归纳来证明的。虽然关于左侧折叠实例的函数的定理通常比右折叠实例的定理更难 - 这可能是一个标准。
答案 2 :(得分:0)
这属于证明复杂性下限的有趣且困难的领域。首先,它在很大程度上取决于您正在使用的逻辑系统的强度,以及它允许的证据。一个命题很难在一个系统中证明,而在另一个系统中很容易证明。
接下来的问题是,对于随机命题(在一个相当强大的逻辑系统中),甚至不可能确定它是否可证明(例如,一阶逻辑中的可证明命题集只有recursively enumerable) 。即使我们知道它是可证明的,决定它的证明复杂性可能非常困难或不可判断(如果你找到证据,它并不意味着它是最短的证据)。
直观地看起来它类似于Kolmogorov complexity:对于一般字符串,我们无法分辨出产生它的最短程序是什么。
对于某些证明系统和特定类型的公式,存在已知的下界。哈肯于1989年证明:
对于足够大的 n , PHP ^ n {n-1} _的任何分辨率证明_(鸽子孔原理)需要长度2 ^ {\ Omega(n )}。
These slides概述了该定理。所以你可以使用这样的模式生成命题,但这对游戏来说可能不会很有趣。