gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:57:57 24 4
gpt4 key购买 nike

我对 prolog 还是很陌生,我正在努力思考为什么数学约束似乎与逻辑约束的工作方式不同。

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

f(A, B) :- A = (B xor 2).

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

从我之前的实验来看,似乎我可以编写一个函数,使用二进制文件在逻辑上做到这一点,而不会遇到任何麻烦,而且实际上它是双向的。是什么让数学与众不同?

作为引用,我第一次尝试解决我的问题是这样的:

f(输入,输出):-
A 是输入异或(输入 >> 11),
B 是 A 异或 ((A >> 7)/\2636928640),
C 是 B xor ((B << 15)/\4022730752),
输出是 C xor (C >> 18)。

这从输入到输出都可以正常工作,但反过来不行。如果我切换 is= ,它会产生一个很长的逻辑序列,其中的值被替换,但找不到数值解。

我正在使用具有 xor 的 swi-prolog内置,但它可以很容易地定义。我希望能够使用 prolog 在两个方向上工作这个功能,并且真的不想手动实现逻辑行为。欢迎任何有关我如何重新表述问题的建议。

最佳答案

纯 Prolog 不应该处理数学。驱动 Prolog 的基本算法 - 失败时统一和回溯 - 没有提到算术运算符。大多数 Prolog 实现都将算术作为一种丑陋的 hack 加入到它们的字节码中。

这样做的原因是算术函数的行为方式与仿函数不同。它们不能以同样的方式统一。并非每个函数都保证适用于接地和非接地参数的每种组合。例如,将 X 提高到 Y 的幂的算法与找到 X 的 Y 根不对称。如果所有算术函数都是对称的,那么加密和密码学就行不通了!

也就是说,以下是有关 Prolog 运算符的缺失事实:

首先,'=' 在 Prolog 中不是“等于”,而是“统一”。目标X = Y op Z哪里op是一个运算符,统一 X与仿函数 'op'(Y,Z) .它与算术相等或赋值无关。

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

总结一下:

  • 编写可逆的数学函数需要数学知识和算法才能使函数可逆。在这种情况下,Prolog 不会为你做魔法。
  • 如果您正在寻找智能方程求解,您可能需要检查有限域和连续域的 Prolog 约束求解库。与可逆数学不同,但比 Prolog 的朴素算术运算符更聪明。
  • 关于序言是和=。为什么它们的工作方式与逻辑约束不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012161/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com