binary - 在 Prolog 中从十六进制转换为二进制
问题描述
这是一些将十六进制转换为二进制的程序,我需要得到类似X = [1,1,1,1,0,0,0,0]
for的结果pred([f,0])
。
所以我需要将所有列表合二为一。有人可以告诉我怎么做吗?
hex(0, [0,0,0,0]).
hex(1, [0,0,0,1]).
hex(2, [0,0,1,0]).
hex(3, [0,0,1,1]).
hex(4, [0,1,0,0]).
hex(5, [0,1,0,1]).
hex(6, [0,1,1,0]).
hex(7, [0,1,1,1]).
hex(8, [1,0,0,0]).
hex(9, [1,0,0,1]).
hex(a, [1,0,1,0]).
hex(b, [1,0,1,1]).
hex(c, [1,1,0,0]).
hex(d, [1,1,0,1]).
hex(e, [1,1,1,0]).
hex(f, [1,1,1,1]).
pred([],X).
pred([H|T],X):-
hex(H,Y),
append(X,Y,X),
write(Y),
nl,
pred(T).
我的问题是附加的。
解决方案
让我们从一些例子开始,假设我们已经有了这个谓词:
?- pred( [f, 0], X ).
X = [1,1,1,1, 0,0,0,0]. % that's what you said you want, isn't it?
?- pred( [f, 0], [1,1,1,1, 0,0,0,0] ).
yes.
?- pred( [f | [0]], [1,1,1,1 | [0,0,0,0]] ).
yes.
?- pred( [f | HEX], [A,B,C,D | BIN] ), [A,B,C,D] = [1,1,1,1], pred( HEX, BIN).
yes.
?- pred( [f | HEX], [A,B,C,D | BIN] ), hex(f, [A,B,C,D]), pred( HEX, BIN).
yes.
?- pred( [0 | HEX2], [A2,B2,C2,D2 | BIN2] ), hex(0, [A2,B2,C2,D2]), pred( HEX2, BIN2).
yes.
?- pred( [0 | HEX2], [A2,B2,C2,D2 | BIN2] ), hex(0, [A2,B2,C2,D2]),
HEX2 = [], BIN2 = [], pred( HEX2, BIN2).
yes.
是的?正确的?(如果不清楚,请考虑身份[0] = [0 | []]
)。
这意味着它也必须是这样的
?- HEX2 = [], BIN2 = [], pred( HEX2, BIN2).
yes.
?- pred( [], []).
yes.
瞧,我们看到了基本情况必须是什么。正确的?
此外,我们实际上也已经看到了递归情况必须是什么。而且你不需要任何明确append
的调用。这个:
?- pred( [f | HEX], [A,B,C,D | BIN] ), hex(f, [A,B,C,D]), pred( HEX, BIN).
yes.
可以写成
?- pred( [F | HEX], [A,B,C,D | BIN] ), F = f, hex(F, [A,B,C,D]), pred( HEX, BIN).
yes.
但实际上,它很容易推广到
?- pred( [F | HEX], [A,B,C,D | BIN] ), hex(F, [A,B,C,D]), pred( HEX, BIN).
yes.
你有它。
看?Prolog 很有趣。Prolog 很简单。Prolog只是在说你的意思。
推荐阅读
- c - 为什么空数组的字符串长度与数组大小不同?
- python - 在 PyYAML 中使用表示器时控制折叠位置
- jenkins - SonarQube 扫描仪执行期间 Sonarqube 失败
- php - Woocommerce 订单详细信息未正确加载
- kubernetes-helm - Helm:在值 YAML 文件中使用变量
- elasticsearch - 来自容器化 WebApp 的日志不会通过 Serilog.Sinks.Elasticsearch 发送到 Elasticsearch
- python - 如何使用 google colab 在同一视频上创建第二个窗口
- laravel - Nginx 不显示页面 laravel
- android - 以编程方式显示/隐藏 TextInputLayout 底部笔划
- commercetools - 如何在 commercetools 项目中获取所有产品的变体数量?