【问题标题】:Wrap every element from a list包装列表中的每个元素
【发布时间】:2019-09-23 02:22:34
【问题描述】:

如何包装列表中的每个元素?

我有这样的(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

【问题讨论】:

  • 可能想查看library(yall),它为您提供了 lambda 抽象。否则你需要做一个谓词来传递给maplist/3

标签: prolog maplist


【解决方案1】:

您的输入数据结构不包含任何列表,它是一个嵌套结构,叶子上有数字:

?- 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)

【讨论】:

    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2020-06-05
    • 2023-03-19
    相关资源
    最近更新 更多