可逆的“二进制到数字”谓词
以可逆的方式将二进制位(例如,可能是 0/1 的列表)转换为数字的最佳方法是什么?我已经用 swi 编写了一个本机谓词,但是有更好的解决方案吗? 此致
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
以可逆的方式将二进制位(例如,可能是 0/1 的列表)转换为数字的最佳方法是什么?我已经用 swi 编写了一个本机谓词,但是有更好的解决方案吗? 此致
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
使用 CLP(FD) 约束,例如:
示例查询:
Use CLP(FD) constraints, for example:
Example queries:
这是我想到的解决方案,或者更确切地说是我希望存在的解决方案。
该解决方案也会因以下查询而终止:
Here is the solution I was thinking of, or rather what I hoped exists.
This solution also terminates for queries like:
解决方案
该答案旨在提供一个谓词
binary_number/2
来表示 逻辑纯度 和最佳终止属性。我使用了when/2
来阻止像canonical_binary_number(B, 10)
这样的查询在找到第一个(唯一的)解决方案后进入无限循环。当然,这是一个权衡,该计划现在有多余的目标。纯度和终止
我声称这个谓词呈现。我希望我从这些答案中得到了正确的答案:一个,两个和三个。
任何具有适当参数的目标都会终止。如果需要检查参数,实现此目的的最简单方法是使用内置的
length/2
:示例查询
The solution
This answer seeks to provide a predicate
binary_number/2
that presents both logical-purity and the best termination properties. I've usedwhen/2
in order to stop queries likecanonical_binary_number(B, 10)
from going into infinite looping after finding the first (unique) solution. There is a trade-off, of course, the program has redundant goals now.Purity and termination
I claim that this predicate presents logical-purity from construction. I hope I got it right from these answers: one, two and three.
Any goal with proper arguments terminates. If arguments need to be checked, the simplest way to achieve this is using the built-in
length/2
:Example queries
玩比特...
playing with bits...
可以使用递归,而不是
reverse/2
:swi-prolog 中的结果:
Can use recursion, instead of
reverse/2
:Results in swi-prolog: