# How do I use an operation on every element of a list?

**URL:** <https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802>\
**Category:** Help!\
**Tags:** how-to\
**Created:** [January 29, 2020, 6:50pm UTC](https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802 "2020-01-29T18:50:18Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![DougDimmadome](https://avatars.discourse-cdn.com/v4/letter/d/35a633/32.png) [@DougDimmadome](https://swi-prolog.discourse.group/u/DougDimmadome)\
**Post date:** [January 29, 2020, 6:50pm UTC](https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802/1 "2020-01-29T18:50:18Z")

</div>

Hello there, prolog newbie here!

Simple question, probably with a simple answer:  
**How do I use an operation on every element of a list?**

For example:  
Lets say I have a predicate adding 4 to the given variable:

`plusFour(X,Y) :- Y is X+4.`

And now I want to use that on the list [1,2,3], so that it outputs [4,5,6].  
How exactly would I do that?

Thanks in advance! 🙂

---

<div class="post-metadata">

**Author:** ![peter.ludemann](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/peter.ludemann/32/48_2.png) [@peter.ludemann](https://swi-prolog.discourse.group/u/peter.ludemann)\
**Post date:** [January 29, 2020, 7:19pm UTC](https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802/2 "2020-01-29T19:19:54Z")

</div>

```prolog
1 ?- [user].
|: plusFour(X,Y) :- Y is X+4.
|:
% user://1 compiled 0.00 sec, 1 clauses
true.

2 ?- maplist(plusFour, [1,2,3,4], Z).
Z = [5, 6, 7, 8].

```

---

<div class="post-metadata">

**Author:** ![DougDimmadome](https://avatars.discourse-cdn.com/v4/letter/d/35a633/32.png) [@DougDimmadome](https://swi-prolog.discourse.group/u/DougDimmadome)\
**Post date:** [January 29, 2020, 7:36pm UTC](https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802/3 "2020-01-29T19:36:25Z")

</div>

Is there a way to do it without a predefined predicate (i.e. maplist)?

---

<div class="post-metadata">

**Author:** ![peter.ludemann](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/peter.ludemann/32/48_2.png) [@peter.ludemann](https://swi-prolog.discourse.group/u/peter.ludemann)\
**Post date:** [January 29, 2020, 7:56pm UTC](https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802/4 "2020-01-29T19:56:50Z")

</div>

`maplist/3` is written in Prolog. You can see the code here: [https://github.com/SWI-Prolog/swipl-devel/blob/deb87d4b884c7e68349a8c2ecbe49615c995cc5e/library/apply.pl#L177](https://github.com/SWI-Prolog/swipl-devel/blob/deb87d4b884c7e68349a8c2ecbe49615c995cc5e/library/apply.pl#L177)

---

<div class="post-metadata">

**Author:** ![kowalsky](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/kowalsky/32/394_2.png) [@kowalsky](https://swi-prolog.discourse.group/u/kowalsky)\
**Post date:** [January 30, 2020, 11:35am UTC](https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802/6 "2020-01-30T11:35:27Z")

</div>

You can even generalize it to `plusN`:

```prolog
?- assert(plusN(N, X, Y) :- Y is X + N).
true.

?- maplist(plusN(4), [1,2,3,4], Z).
Z = [5, 6, 7, 8].

```

---

<div class="post-metadata">

**Author:** ![CapelliC](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/capellic/32/17_2.png) [@CapelliC](https://swi-prolog.discourse.group/u/CapelliC)\
**Post date:** [January 30, 2020, 3:59pm UTC](https://swi-prolog.discourse.group/t/how-do-i-use-an-operation-on-every-element-of-a-list/1802/7 "2020-01-30T15:59:10Z")

</div>

I think you’re looking for library([yall](https://www.swi-prolog.org/pldoc/man?section=yall)). It’s autoloaded, so you don’t need to explicitly load it (by use\_module or :- [library(yall)]). That is:

```prolog
?- Xs=[1,2,3],N=4,maplist({N}/[X,Y]>>(Y is X+N),Xs,Ys).
...
Ys = [5, 6, 7].

```
