- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何定义 feature structure unification and subsumption在 minikanren 中,如果我们代表 feature structures有列表吗?
一般行为是这样的(我认为):
(run* (q) (unifyo '(a b) '(a b) q))) => (a b)
(run* (q) (unifyo '(x (a b)) '(x (c d)) q)) => (x (a b) (c d)) (x (c d) (a b))
(run* (q) (unifyo '(x (a b)) '(x (a d)) q)) => () ; fails because '(a b) is
; incompatible with '(a d)
(run* (q)
(fresh (y) (unifyo '(x (a b)) `(x ,y) q)) => (x (a b)))
(run* (q) (unifyo q '(x (a b)) '(x (a b) (c d)))) => (x (c d))
<小时/>
以下代码可以工作,但是当使用 run* 运行时,向后统一会卡住:
;; unifies f1 with l2
(define unify-f-with-list°
(lambda (f1 l2 out)
(conde
[(== '() l2) (== `(,f1) out)]
[(fresh (la ld a2 d2 a1 d1 res)
(=/= '() l2)
(== `(,la . ,ld) l2)
(== `(,a2 . ,d2) la)
(== `(,a1 . ,d1) f1)
(conde
[(== a2 a1)
(== `(,res . ,ld) out)
(unify° f1 la res)]
[(fresh ()
(=/= a2 a1) ;; if not
(== `(,la . ,res) out)
(unify-f-with-list° f1 ld res))]))])))
(define unify-list-with-list°
(lambda (l1 l2 out)
(conde
[(== '() l1) (== l2 out)]
[(== '() l2) (== l1 out)]
[(fresh (a1 d1 res)
(=/= '() l1)
(== `(,a1 . ,d1) l1)
(unify-f-with-list° a1 l2 res)
(unify-list-with-list° d1 res out))])))
(define unify°
(lambda (f1 f2 out)
(conde
[(== f1 f2) (== f1 out)]
[(fresh (a1 d1 a2 d2)
(=/= f1 f2)
(== `(,a1 . ,d1) f1)
(== `(,a2 . ,d2) f2)
(== a1 a2)
(fresh (res)
(unify-list-with-list° d1 d2 res)
(== `(,a1 . ,res) out)))])))
最佳答案
您可以通过修改 minikanren 实现中的统一代码来实现这一点。
我建议不要使用列表来表示特征结构,相反,您可以定义一个新的记录类型,而不是保存一个始终以新变量终止的列表,其中一个将表示特征结构。然后您仍然可以使用列表和其他对象以及使这些新对象可用。
当统一代码看到两个特征结构时,它需要递归地统一所有匹配的键,并扩展每个键的“其余”部分以包含另一个特征结构特有的字段(无破坏性突变)。
关于scheme - minikanren 中的特征结构统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53435720/
如何定义 feature structure unification and subsumption在 minikanren 中,如果我们代表 feature structures有列表吗? 一般行为
我目前正在通过 The Reasoned Schemer 和 Racket 学习 miniKanren。 我有三个版本的 minikanren 实现: The Reasoned Schemer,第一版
MiniKanren 有“not”运算符吗? 例如,如何表示 Prolog 的 a :- b, not(c) 如果 b 为真且 c 不为真, a 为真(Prolog 使用否定作为失败,即如果 c 无法
在 Prolog - 人工智能编程中,布拉特科在第 58 页说了以下内容。 “Prolog 中的匹配对应于逻辑中所谓的统一。但是,我们避免使用统一这个词,因为出于效率原因,在大多数 Prolog 系统
在迷你看人,succeed可以定义为(define succeed (== #t #t)) , 和 fail可以定义为(define fail (=== #t #f)) .但是 #s 呢?和 #u s
我从《The Reasoned Schemer - 第二版》这本书和 DrRacket 方案环境开始学习 miniKanren。 我安装了“faster-minikanren”包,但书中的第一个例子使
所有 miniKanren 关系都以字母结尾 o .这样做的动机是什么? 我看到 Clojure core.logic 库也这样做了。 最佳答案 在 The Reasoned Schemer 的序言中
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
最近我一直在研究像 Neo4j 这样的图形数据库以及 Prolog 和 miniKanren 中的逻辑编程。从我到目前为止所学到的,两者都允许指定事实和它们之间的关系,并且还可以查询结果系统以进行一些
这是我关于 Stack Overflow 的第一个问题。 我是逻辑编程的新手,正在尝试评估它是否可以用来解决我正在处理的一些匹配问题。 问题: 假设我们有一个看起来像这样的集合 A。 A = {1,
我是一名优秀的程序员,十分优秀!