23个版本
0.7.2 | 2024年5月17日 |
---|---|
0.7.1 | 2022年5月31日 |
0.7.0 | 2022年3月22日 |
0.5.2 | 2021年9月6日 |
0.4.2 | 2020年10月28日 |
#99 in 算法
1,458每月下载量
用于 caso
73KB
1.5K SLoC
Avalog
Avalog是一个使用类似Prolog语法的Avatar逻辑的实验性实现。
=== Avalog 0.7 ===
Type `help` for more information.
> parent'(alice) : mom
> (bob, parent'(alice))
> prove mom(bob) => parent'(alice)
parent'(alice) : mom
(bob, parent'(alice))
----------------------------------
mom(bob) => parent'(alice)
OK
要从终端运行Avalog,请输入
cargo install --example avalog_repl avalog
然后,要运行
avalog_repl
动机
Avatar Logic试图创建一种满足“avatars”的正式语言,类似于Avatar Extensions。Avatar Extensions是Path Semantics中的一种抽象泛化技术,Path Semantics是一种非常适用于数学编程的高度表达性语言。
在更高维度的编程中,如Path Semantics,人们希望同时泛化多个维度的抽象,而无需为每个维度编写公理。
如果常规编程是二维的,那么Path Semantics中的常规路径就是三维的。Avatar Extensions试图超越三维编程到任意高维度。Avatar Logic是讨论Avatar Graphs的解释的一个深刻结果,它将笛卡尔组合学的变体与图、群作用和拓扑联系起来。
示例:奶奶爱丽丝
uniq parent
parent'(alice) : mom
grandparent'(alice) : grandma
parent'(bob) : dad
(bob, parent'(alice))
(carl, parent'(bob))
(X, grandparent'(Z)) :- (X, parent'(Y)), (Y, parent'(Z)).
这可以用来证明以下目标
grandma(carl) => grandparent'(alice)
第一个语句uniq parent
表示1-avatar parent
应该表现出独特性。基本上,这意味着一个人最多只能有一个妈妈和一个爸爸。
当这个特性关闭时,人们只能说例如“鲍勃有一个名叫爱丽丝的妈妈”,但不能说“鲍勃的妈妈是爱丽丝”,因为鲍勃可能有多个妈妈。
从形式上讲,mom(bob) => parent'(alice)
(具有)与mom(bob) = parent'(alice)
(是)。
语句parent'(alice) : mom
表示Alice有一个1-化身“parent”,被分配了“mom”的角色。化身逻辑“知道”Alice和Alice作为parent是同一个人,但与Alice的关系是普遍的,而作为parent的关系则取决于上下文。
关系(bob, parent'(alice))
没有指定Bob和Alice作为parent如何相关联,因为这是从分配给Alice作为parent的角色中推断出来的。这对于编程的高维度逻辑大大简化了逻辑。
规则(X, grandparent'(Z)) :- (X, parent'(Y)), (Y, parent'(Z)).
类似于Horn子句,它在Prolog中用于。
grandparent规则适用于妈妈和爸爸的任何组合。它还适用于其他可以用于例如动物的父系关系。您可以为不同类型的对象使用单独的角色,但不能混合例如人类和动物。这是因为化身逻辑类似于依赖类型,但用于逻辑。关系取决于值,但强制执行局部一致性,类似于类型。
化身逻辑简介
在Prolog中,您将使用谓词编写关系,例如mom(alice, bob)
。问题是谓词是1)不受约束的,2)公理不携带任意笛卡尔关系。
在化身逻辑中,您使用带有角色和化身附加公理的“二元关系”来代替谓词。
要解释化身逻辑如何工作,可以从二元关系开始。
二元关系是一个有序对
(a, b)
通过向二元关系添加公理,可以提高表达性和简化对抽象关系的建模。这被用于,因为不受约束的关系对于形式化高级数学理论(如路径语义)太难使用。
化身逻辑由两种类型的对组成
公理
p(a, b) b : p p(a) = b
p(a, q'(b)) q'(b) : p p(a) = {q'(_)} ∈ q'(b)
为了使化身二元关系的行为类似于唯一通用二元关系,可以使用uniq q
指令,其中q
是一个1-化身。这强制了以下关于q
的关系
p(a) = q'(b)
设计
使用Monotonic-Solver库进行通用自动定理证明。
使用Piston-Meta库进行元解析。
化身逻辑的公理不能直接使用,而是从公理中推导出推理规则。
本项目的一部分是进行推理规则的实验,因此尚未发布任何推荐的推理集。
推理规则在 infer
函数中编码。
依赖项
~280KB