prolog - 在 Prolog 中调用规则

标签 prolog combinatorics knights-tour

我正在尝试解决 Knight Tour 问题。 我想调用一个规则来评估可能的移动,但我无法让我的规则返回我发送的变量中的下一个位置。

    move(X,Y):-
      X is X+1,
      Y is Y-2.
    move(X,Y):-
      X is X+2,
      Y is Y-1.

在控制台中,我发送 move(2,2) 例如,我希望返回 3,0 和 4,1,但返回 false。

最佳答案

除了 @coder (+s(0)) 提供的答案之外,我建议使用库(clpfd)、坐标的对表示和反射(reflect)哪个参数是什么的名称,例如从_到/2。那么你的谓词可能看起来像这样:

:- use_module(library(clpfd)).

from_to(X-Y,X1-Y1):-
   X1 #= X+1,
   Y1 #= Y-2.
from_to(X-Y,X1-Y1):-
   X1 #= X+2,
   Y1 #= Y-1.

使用 clpfd 可以双向使用谓词,例如:我在位置 3-4,我可以移动到哪里?

   ?- from_to(3-4,T).
T = 4-2 ? ;
T = 5-3

或者:我在位置 3-4,我来自哪里?

   ?- from_to(F,3-4).
F = 2-6 ? ;
F = 1-5

如果您使用 is/2 定义谓词,则后一种情况不起作用,因为在这种情况下,右侧的表达式将被实例化:

   ?- X is 3+4.
X = 7
   ?- 7 is X+4.
     ERROR!!
     INSTANTIATION ERROR- in arithmetic: expected bound value
   ?- 7 is 3+X.
     ERROR!!
     INSTANTIATION ERROR- in arithmetic: expected bound value

关于prolog - 在 Prolog 中调用规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43723118/

相关文章:

c - 带有递归和回溯的骑士​​之旅代码

prolog - 序言中对称关系的传递闭包

prolog - Prolog 中使用集合进行约束逻辑编程

list - 构建一个长度为 n 的相同值的列表 Prolog

c# - 生成所有可能的组合

c# - 如何获得一组可复制元素的所有唯一 n 长组合?

python - 谜语: The Square Puzzle

Java 解决骑士之旅需要很长时间

Prolog:解压缩对列表

kotlin - 如何以函数式风格生成一定长度的非穷举排列