Writing vector-membero in minikanren



我正在尝试为miniKanren(1(编写一个适用于向量的membero等价物。到目前为止,我找不到一种不涉及观察值是逻辑变量还是部分实例化的方法。有什么指示吗?

目前,我有:

(defun rangeo (x n)
(when (mu-var-p n)
(error "rangeo must be called with a fully instantiated second argument"))
(if (<= n 0)
+fail+
(conde
((== x (1- n)))
((rangeo x (1- n))))))
(defun vmembero (x v)
(when (mu-var-p v)
(error "vmembero must be called with a partially instantiated second argument"))
(fresh (i)
(rangeo i (length v))
(project (i)
(== x (aref v i)))))

(1(:没关系,但我实际上是在用cl-kanren;不过,我认为这里的任何事情都不应该取决于此。cl-kanren确实具有矢量的统一功能。

实现此回落到方案。您将无法在纯迷你坎伦中实现它。

此外,您不应该将过程应用程序嵌套在表达式中,例如(== x (1- n))(rangeo i (length v))。尽量坚持纯逻辑谓词或纯方案谓词。

您可能希望扩展我们的统一算法,以透明地统一向量。您可能会发现您需要完全转换术语的表示形式。

最新更新