Prolog是和=.为什么它们的工作方式与逻辑约束不同?

Pau*_*lan 3 prolog bitwise-operators

我仍然是prolog的新手,我正试图解决为什么数学约束似乎不像逻辑那样工作的方式.

似乎有足够的信息来解决这个问题:

f(A, B) :- A = (B xor 2).
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试时f(C, 3),我回来了C = 3 xor 2.,这不是很有帮助.更不实用的是,如果输入被反转,它根本无法找到解决方案.使用is而不是=使示例输入返回正确的答案,但反过来拒绝甚至尝试任何东西.

从我之前的实验中看来,似乎我可以编写一个使用二进制文件逻辑上完成这个功能而没有麻烦的功能,事实上它会双向进行.是什么让数学与众不同?

作为参考,我第一次尝试解决我的问题看起来像这样:

f(Input, Output) :- 
    A is Input xor (Input >> 11),
    B is A xor ((A >> 7) /\ 2636928640),
    C is B xor ((B << 15) /\ 4022730752),
    Output is C xor (C >> 18).

这从输入到输出都可以正常工作,但不是相反.如果我切换is=,它会产生一个长的逻辑序列,其值被替换但无法找到数值解.

我正在使用xor内置的swi-prolog ,但它可以很容易地定义.我希望能够使用prolog在两个方向上完成这个功能,并且真的不希望必须手动实现逻辑行为.关于如何重新解决问题的任何建议都是值得欢迎的.

Lit*_*les 5

Pure Prolog不应该处理数学.驱动Prolog的基本算法 - 统一并在失败时回溯 - 不提算术算子.大多数Prolog实现将算术作为一个丑陋的黑客添加到他们的字节码中.

这样做的原因是算术函数的作用与仿函数不同.它们不能以同样的方式统一.并非每个函数都能保证适用于地面和非地面参数的每个组合.例如,将X提升到Y的幂的算法与找到X的Yth根不对称.如果所有算术函数都是对称的,则加密和加密将不起作用!

也就是说,这里有关于Prolog运营商的缺失事实:

首先,'=' 在Prolog中不是 "等于",而是"统一".我们的目标X = Y op Z,其中op是一个运营商,结合X与仿函数'op'(Y,Z).它与算术相等或赋值无关.

其次,is丑陋的数学黑客,并不能保证是可逆的.的目标X is Expr,其中Expr是一个算术表达式,第一计算表达式,然后尝试将它分配给X.它并不总是适用于数字和变量的每个组合 - 请检查Prolog库文档.

总结一下:

  • 编写可逆数学函数需要数学知识和算法来使函数可逆.在这种情况下,Prolog不会为你做魔术.
  • 如果您正在寻找智能方程求解,您可能需要检查有限和连续域的Prolog约束求解库.与可逆数学不同,但比Prolog的天真算术运算符更聪明.