【发布时间】:2011-02-16 03:15:13
【问题描述】:
我对 prolog 还是很陌生,我正试图弄清楚为什么数学约束似乎不像逻辑约束那样起作用。
似乎有足够的信息来解决这个问题:
f(A, B) :- A = (B xor 2).
但是当我尝试f(C, 3) 时,我会返回C = 3 xor 2.,这不是很有帮助。更没用的是,如果输入反转,它根本无法找到解决方案。使用 is 而不是 = 会使示例输入返回正确的答案,但反过来甚至拒绝尝试任何事情。
从我之前的实验来看,我似乎可以编写一个函数,使用二进制文件在逻辑上执行此操作而不会遇到麻烦,而且它实际上是双向的。是什么让数学与众不同?
作为参考,我第一次尝试解决我的问题是这样的:
f(输入,输出):- A 是输入异或(输入 >> 11), B 是 A xor ((A >> 7) /\ 2636928640), C 是 B xor ((B > 18)。从输入到输出都可以正常工作,但反之则不行。如果我将is 切换到=,它会产生一个长逻辑序列,其中的值被替换但找不到数值解。
我正在使用内置xor 的swi-prolog,但它也可以很容易地定义。我希望能够使用 prolog 在两个方向上运行此功能,并且真的不想手动实现逻辑行为。欢迎任何关于我如何重新表述问题的建议。
【问题讨论】: