prolog - 包装列表中的每个元素
问题描述
如何包装列表中的每个元素?
我有这样的东西(2*3*4*...)^6
如何使用此输出制作列表:2^6 * 3^6 * 4^6 * ...
我正在考虑使用 maplist 做一些简单的事情,但我不确定如何在第一个参数中向函数发送参数。
simplify(X^Y,R):- X=..[*|Args], maplist(?^Y, Args, Args2), R=..[*|Args2], !.
:- simplify((2*x)^6, (2^6) * (x^6)). %should be true
顺便使用 Swi-prolog
解决方案
您的输入数据结构不包含任何列表,它是一个嵌套结构,叶子上有数字:
?- write_canonical(2*3*4*5).
*(*(*(2, 3), 4), 5)
因此 maplist 在这里用处不大。相反,编写一个简单的递归谓词来遍历(和重构)递归数据结构:
simplify(N, Exp, N^Exp) :-
number(N).
simplify(L*R, Exp, LExp*RExp) :-
simplify(L, Exp, LExp),
simplify(R, Exp, RExp).
代码结构遵循数据结构。示例运行
?- simplify(2*3*4*5, 6, E).
E = 2^6*3^6*4^6*5^6
Yes (0.00s cpu)
推荐阅读
- bash - 从 bash 中的响应中访问元素
- database - 如何在新服务器中设置现有的 postgres 数据库?
- javascript - 删除待办事项列表项
- powershell - 计算目录中的文件数以及文件夹数
- arrays - 如何访问我使用 shellscript 在 AD 上恢复的数组上的密钥
- google-chrome - ubuntu 18.04 chrome 无法打开显示
- bash - ssh 函数上的 bash 脚本中的意外行为
- python - Scrapy:抓取到 CSV 文件 - 获取无组织的 CSV 文件
- postgresql - Prometheus PostgreSQL 服务器导出器示例无法在 MacOS 上运行?
- r - 如何将数据与因子水平相关联?