#avatar #logic #logic-programming #prolog #solver #advanced-research

avalog

基于Prolog语法的一个Avatar逻辑的实验性实现

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 算法

Download history 138/week @ 2024-05-15 13/week @ 2024-05-22 1/week @ 2024-05-29 2/week @ 2024-06-05

1,458每月下载量
用于 caso

MIT/Apache

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 Binary Relations

动机

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