Обернуть каждый элемент из списка - PullRequest
1 голос
/ 23 сентября 2019

Как вам обернуть каждый элемент списка?

У меня есть что-то вроде этого (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-пролога между прочим

1 Ответ

1 голос
/ 23 сентября 2019

Ваша структура входных данных не содержит никаких списков, это вложенная структура с числами на листьях:

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