prolog - 类似Prolog的统一可以用无点的方式表达吗?

标签 prolog j pointfree unification

模式匹配可以使用point free风格来实现,网上有很多关于它的文章。我想知道更广义的情况是否也成立,即是否有可能以直接的方式用像 J 这样的点自由语言实现 Prolog 的统一。

基本上我想知道是否有任何方法可以弥合点自由语言和 Prolog 之间的差距。

最佳答案

我不确定您是否对 J 中统一过程的实现更感兴趣,或者如何在没有逻辑变量的情况下在语法上表达统一更感兴趣,但我将讨论两者,因为它们密切相关。

MicroKanren in J: an Embedding of the Relational Paradigm in an Array Language with Rank-Polymorphic Unification (PDF) 描述了在 J 中嵌入逻辑编程的统一算法的基本实现。

统一通常表现为搜索项相等的替换的任务,但结果并不是真正的一般替换,因为我们想要替换的唯一项是元变量。如果我们可以替换任何子项,问题就会容易得多!

因此,我们也可以将其视为证明搜索任务:我们的目标是找到一个上下文,其中包含一组元变量的绑定(bind),它递归地等于两个输入项。我们通过矛盾来做到这一点:如果我们可以证明不存在这样的上下文,那么这些术语就不会统一;如果我们不能,反例将是统一它们的上下文。

在此 J 实现中,这样的上下文自然表示为装箱数组,变量作为同一数组的索引,其中未绑定(bind)变量指向其自己的索引。这是与 Warren Abstract Machine 类似的术语表示。 ,通常用作 Prolog 实现的基础;您可以在 Warren’s Abstract Machine: A Tutorial Reconstruction 的 §2.1 中找到更多示例(PDF).

使用带有 ^:_ 的“do–while”结构,沿着索引链查找变量,直到到达固定点。它使用 J 的前序遍历原语“map”{:: 将输入项展平为一系列路径。在一项中以变量结尾的路径等同于另一项中对应路径的项。

这是一个重要的见解:在结构上使两个术语等同意味着子术语通过它们的位置来识别。命名逻辑变量只是指定子项之间约束的一种简洁方式。

因此,这也提出了一种设计无变量符号以实现统一的方法,尽管我不会对此进行深入探讨。任何项,例如 p(5, q(10), 15) 都可以描述为其形状的一对,其中值有“间隙”,以及填充这些间隙的替换:p(□, q(□), □)·[5,10,15];遍历顺序的选择允许按位置而不是按名称分配内容。

例如,Prolog 风格的统一 f(X, f(X, g)) = f(h, Y)可以看作嵌套形状方程 f(A, f(B, C)) = f(D>、E),以及一组内容方程 {A = DB = A , C = g, D = h, E = f(B, C)}。但同样,将形状视为未标记和平坦、按索引填充内容、将内容方程单独视为等价类向量(由彩色形状表示)同样有效。

  • 左:f( 🟥 , 🟢 )·[ 🟥 , f( 🟥 , 🔷 )·[ 🟥 , g ] ]
  • 右:f( 🟥 , 🟢 )·[ h, 🟢 ]
  • 并集:f( 🟥 , 🟢 )·[ h, f( 🟥 , 🔷 )·[ 🟥 , g ] ]

(请注意,替换也可以留下未填补的空白,基本上充当该位置的标识。)

关于prolog - 类似Prolog的统一可以用无点的方式表达吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76266118/

相关文章:

j - 读取文件后删除 CR 或 LF 或 CRLF

javascript - 使用 Ramda 进行函数组合

haskell - 有没有更好的方法来用无点符号表示绝对误差函数?

prolog - Prolog 中的析取之间交替

prolog - B-Prolog 中带累加器的嵌套循环

filtering - J : indexing from one into another 中的数组

string - 将字符串评估为 J 中的动词

list - Prolog:从列表B中删除列表A中出现的所有元素

prolog - 如何判断 clpfd 程序的计算复杂度是多少?

haskell - pointfree Haskell 中通过映射的乘法表