使用有限域声明降序/升序坐标的谓词

Posted

技术标签:

【中文标题】使用有限域声明降序/升序坐标的谓词【英文标题】:Predicate to declare descending/ascending coordinates using finite domains 【发布时间】:2012-09-03 12:51:43 【问题描述】:

我想写一个谓词,destroy,它声明第一个给定坐标 [y, x] 下降到第二个给定坐标(想象一下左上角有 [0, 0] 的棋盘)。

Prolog 中的一个非常简单的实现可能如下所示:

descending(B, A) :-
  B = [B1,B2],
  A = [A1,A2],
  B1 is A1 + 1,
  B2 is A2 + 1.

不过,我无法在 core.logic 中实现这一点。我已经尝试了很多不同的东西(==/=fd/conso/appendo 和+fd/+)。我尝试过的一件事:

(defn descendo
  [b a]
  (l/fresh [b1 b2 a1 a2]
           (l/== b [b1 b2])
           (l/== a [a1 a2])
           (l/+fd b1 1 a1)
           (l/+fd b2 1 a2)))

它们中的大多数在像这样运行它们时什么都不返回:

(l/run* [q]
  (l/fresh [a]
    (l/infd a (l/domain [0 0] [1 0] [0 1] [1 1]))
    (descendo a [0 0])
    (l/== q a)))

=> () ; expected output: ([1 1])

我觉得在使用 core.logic 时在 Prolog 中想太多是不好的……任何提示都值得赞赏。提前致谢。

编辑:找到了一种解决方法,其中desendo 保持不变,但是在运行它时我们不使用域:

(l/run* [q]
  (l/fresh [a]
    (l/membero a [[0 0] [1 0] [0 1] [1 1]])
    (l/membero q [[0 0] [1 0] [0 1] [1 1]])
    (descendo a q)))

=> ([1 1])

我不确定domain 是否打算用于向量,所以这可能不是一种解决方法,而是实际的解决方案。

【问题讨论】:

core.logic 中的 FD 仅适用于自然数,不适用于向量等 请将您的解决方案发布为解决方案 :-) 【参考方案1】:

找到了一种解决方法,其中 descendo 保持不变,但是在运行它时我们不使用域:

(l/run* [q]
  (l/fresh [a]
    (l/membero a [[0 0] [1 0] [0 1] [1 1]])
    (l/membero q [[0 0] [1 0] [0 1] [1 1]])
    (descendo a q)))

=> ([1 1])

我不确定 domain 是否打算用于向量,所以这可能不是一种解决方法,而是实际的解决方案。

【讨论】:

以上是关于使用有限域声明降序/升序坐标的谓词的主要内容,如果未能解决你的问题,请参考以下文章

具有多种类型的 PDDL 谓词变量

谓词逻辑

不允许用于访问此页面的 HTTP 谓词 Web Api IIS 7

更新声明:[Amazon](500310) 无效操作:目标表必须是等值连接谓词的一部分;

Swift / Cloudkit 谓词格式

加载程序集并在另一个应用程序域中对其类型应用谓词