POI:Rust中的实用无点定理证明器助手

2020-05-16 14:03:04

=Poi Reduce 0.2==有关详细信息,请键入`help`。>;AND[NOT]AND[NOT]OR(AND[NOT]=&gT;OR)。

在计算两个拼接列表的长度时,有一种更快的方法,那就是计算每个列表的长度并将其相加:

>;(镜头。Concat)(a,b)(len·conat)(a,b)(len·contat)(A)(B)(contat[len]·(len·fst,len·snd))(A)(B)(add·(len·fst,len·snd))(A)(B)<;=>;add((len·fst)(A)(B),(len·snd)(A)(B))>;add((len·fst)(A)(B),(len·snd)(A)(B))add((len·fst)(A)(B),(len·snd)(A)(B))add((len·fst)(A)(B))((len·snd)(A)(B))add(len(A))((len·snd)(A)(B))add(len(A))(len(B))。

在";无点编程或默契编程中,函数不标识它们操作的参数(或";点&34;)。在";或";默契&34;编程中,函数不标识它们操作的参数(或";点&34;)。请参阅维基百科的文章。

POI是路径语义的一个小子集的实现,为了解释POI是如何工作的,需要对路径语义进行一些解释。

路径语义是数学规划的一种极富表现力的语言,除了常规的计算外,它还具有路径空间。如果正常的编程是2D的,那么路径语义就是3D的。路径语义经常与范畴论、逻辑等结合使用。

如果反转`and`函数的输入和输出位,则可以使用函数`or`直接从输入位预测输出。

在普通编程中,没有办法直接表达这一思想,但您可以将逻辑关系表示为等式:

NOT x NOT NOT O->;o->;路径空间|AND||或|V V|o->;o V不计算。

计算和路径空间都是方向性的,这意味着人们不能总是找到逆。路径空间中的合成就是函数合成:

路径语义可以看作是无点风格的方程式子集,这个方程式子集对编程特别有帮助。

对编程有用的有效数学知识依赖于了解函数的等价性。这意味着您想要构建的知识越多,您需要象征性地命名和引用的函数就越多。

这意味着,使用鸟瞰的数学理论除了作为寻找解决方案的指南外,对于解决具体问题没有什么用处。理论越笼统、越有表现力,就越难进行证据搜索。

因此,在计算+路径空间上的定理证明比仅仅为了计算而证明定理要困难得多。

例如,类型理论对检查程序是否正确很有用,但是对于更高的类别,在保持高效和可用的同时,要使语义扎根变得越来越困难。

路径语义学使用一种不同的方法,它是基于符号的。当一个符号被创建时,理论致力于保留符号中的路径,这在同伦类型理论中是已知的,与证明相对应。由于符号本身将这种关系编码为证明,这意味着证明可以是任意复杂的而不影响复杂性。

这与纯粹的公理系统不同。在纯粹的公理系统中,符号除了彼此之间的关系(公理)之外没有意义。因此,你得到的是对皮亚诺公理的非标准解释。在路径语义学中,如果你说自然数,你指的是自然数,而不是皮亚诺公理所描述的自然数。符号自然数是你意思的证明,在路径语义中意味着。

可以用路径语义来表达被认为是真的,但不能用任何形式语言证明为真的思想。总有一天,可能会发明一种正式的语言来证明这句话是正确的,但程序员们并不想让这种情况发生。取而代之的是,他们默认采取务实的策略,比如广泛使用。例如,戈尔德巴赫猜想已经被测试到一定的极限,所以它适用于所有低于这个极限的自然数。一个实用的策略是当你不能理想化问题时所做的事情。

POI在其设计中使用了实用的方法,因为许多证明inPath语义不需要或几乎不需要在无点样式中进行类型检查。

这意味着任何人都可以在POI之上创建自己的工具,而不需要太多依赖。

POI主要使用重写规则来证明定理,这意味着核心设计是愚蠢的,当给出错误的规则时,它会做一些愚蠢的事情,比如在无限循环中运行。

然而,这种设计也使得POI非常灵活,因为它可以以任何方式进行模式匹配,与计算方向无关,在Rust代码中定义这样的规则相对容易。

POI使用Piston-Meta描述其语法。Piston-Meta是一种用于人类可读文本文档的元分析语言,它可以很容易地对POI的语法进行更改,并保持向后兼容性。

由于Piston-Meta可以描述自己的语法规则,这意味着未来的Piston-Meta可以解析旧版本POI的语法,然后可以通过合成将旧文档转换成新版本的POI。

/函数表达式。#[Derate(Clone,PartialEq,Debug)]pub enum expr{/与符号知识一起使用的符号。sym(符号),/某些函数返回值,忽略参数。/这也可以用于存储值,因为零参数是一个值。ret(Value),/函数上的二元运算。op(Op,Box<;expr>;,Box<;expr>;),/多个参数的元组。tup(Vec<;expr>;),/A列表。列表(Vec<;Expr&>),}。

EXPR结构的简单性很重要,并且在很大程度上基于高级路径语义知识。

符号包含每个领域特定的符号和符号的化身扩展名。化身扩展是一种从没有自省关系的构建块集成信息处理的技术。这意味着,即使是符号的某些变体也不是直接意义上的符号,它们之所以放在那里是因为它们集成了符号的信息。例如,变量被归类为1-化身,因为它集成了单个符号或表达式的信息。由于非常复杂的数学关系,化身扩展经常出现在路径语义中,但通常不需要明确表示。相反,它们被用作设计指南。有关更多信息,请参阅论文“化身图表”。

Ret变量来自更高阶运算符重载中使用的符号。它不是将值描述为值,而是被认为是某种未知输入类型的函数,返回已知值。例如,如果函数对所有输入返回2,则其格式为\2。这意味着函数上的无点变换有时可以计算内容,而无需显式地直接引用具体值。有关更多信息,请参阅论文高阶运算符重载和存在路径方程。

Op变体概括了函数上的二元运算符,如组合、路径(正常路径)、应用(调用函数)和约束(部分函数)。

Tup变量表示表达式的元组,其中单个元素(一个元素的元组)被提升了一个级别。例如,这用于从AND[NOT x NOT-&>NOT;NOT]转换到AND[NOT],而不必为非对称情况编写规则。

List Variant表示表达式列表,例如[1,2,3]。这与Tup的不同之处在于单例没有被抬起。

在函数式编程的更高维度中,规范化的定义取决于理论在特定领域的使用。直觉上,由于有更多的方向,什么可以算作通往答案的进程是任意选择的。因此,这种选择的主观性必须体现在知识的表征上。

POI的知识表示是为多用途而设计的。与常规编程不同的是,您不想总是进行评估,而是使用相同的知识为不同的目的设计不同的工具。

/表示有关symbol的知识。pub枚举知识{/符号有一定的定义。def(Symbol,Expr),/通过规范化将更复杂的表达式简化为另一个表达式。red(expr,expr),/两个等价但都不会规格化另一个的表达式。eqv(表达式,表达式),}。

Red变量代表领域特定理论中的归一化。它可以使用正常评估意义上的计算,也可以使用路径空间。这个规则是方向性的,这意味着它的模式与第一个表达式匹配,并绑定使用第二个表达式合成的变量。

eqv变体表示沿着一条路径旅行时可以做出的选择。朝一个方向走可能和另一个方向一样好。这是在不清楚应该往哪个方向走的时候使用的。这条规则是双向的,这意味着你可以把它视为两个方向的减少。