reference. 关系查询参考:DSL与项目谓词[math-000B]

本页是关系查询的速查表。示例式讲解见用miniKanren查询规则与查询没有入向引用的页面;这里集中列出语法与可用谓词。

查询DSL[#127]

  • query/run*:声明要返回的逻辑变量并收集全部解。
  • fresh:引入只在当前目标内可见的存在量词变量。
  • conde:析取,列出多个可接受的目标分支。
  • ==:统一两个项;=/=约束两项不相等。
  • fail/succeed:失败与成功的空目标,用作条件选择。

目标顺序会影响效率:先把变量限定到可索引的类别,再调用nodeo,可以避免枚举全站节点。

规则目录[#128]

ruleo把数学规则目录公开为关系,参数依次是名称、类别、适用模式与docstring:

(query (name modes documentation)
  (ruleo name 'differentiate modes documentation))

math-rule->content把规则名转成文章内容(结构化模式与说明),因此文档与运行时目录来自同一份定义。详见规则查询。

内容节点关系[#129]

分析阶段为每篇文章IR生成content-node relation,记录所属页面、父节点、同级位置、类型、属性、纯文本投影与字符数。常用入口:

  • pageo:页面事实,包括ID、标题与元数据。
  • nodeo:内容节点事实,包括节点ID、类别与属性。
  • node-propertyo:读取节点的某个属性,例如链接目标。
  • source-locationo:节点的源文件、行与列。
  • math-containing-paragrapho、shorter-than-o、plain-text-paragrapho、contains-texto、topic-membero:段落与主题的现成谓词。

跨文章的查询必须在项目的#:analyze阶段运行,因为此时整个站点才分析完成。

项目自定义谓词[#130]

项目可以基于这些事实定义自己的算子。Flora的project.scm就是例子:

  • incoming-pageo:合并link与transclude两种入向引用。
  • not-membero:递归检查一个值不在有限列表中,用作miniKanren的集合差。
  • authored-pageo:用pageo排除inline subtree自动生成的页面。
  • orphan-pageo:没有入向引用的文章页面。

边界[#131]

node-id只在本次分析结果中有效,不应保存为外部引用。关系查询在有限事实集合上计算,不是对无限输入的证明。把项目概念(例如孤立页面)表达为关系,不需要Grove预先知道它。