# Foreach/2 query doesn't bind results to variables

**URL:** <https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726>\
**Category:** Help!\
**Created:** [August 30, 2022, 5:50pm UTC](https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726 "2022-08-30T17:50:49Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![unlocked2412](https://avatars.discourse-cdn.com/v4/letter/u/e47c2d/32.png) [@unlocked2412](https://swi-prolog.discourse.group/u/unlocked2412)\
**Post date:** [August 30, 2022, 5:50pm UTC](https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726/1 "2022-08-30T17:50:49Z")

</div>

Hello, everyone. This is my first post in this fantastic community.

I have the following database:

```prolog

student(cristian, spanish).
student(maria, english).
student(felipe, italian).
student(juan, spanish).

studies(cristian, english).
studies(cristian, portuguese).
studies(maria, hebrew).
studies(juan, english).
studies(wendy, hebrew). 

```

I would like to know if every student whose is a native speaker of X studies the language Y.

I would expect to bind results to variables in the query, something like:

```prolog
?- foreach(student(S, X), studies(S, Y)).

```

I would appreciate any insights. Perhaps, I am not using the correct predicate.

---

<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:** [August 30, 2022, 6:31pm UTC](https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726/3 "2022-08-30T18:31:44Z")

</div>

If a “forall” query fails, then try to find a counter-example:

```prolog
?- student(S, X), \+ studies(S, Y).
S = felipe,
X = italian ;
false.

```

---

<div class="post-metadata">

**Author:** ![kuniaki.mukai](https://avatars.discourse-cdn.com/v4/letter/k/c67d28/32.png) [@kuniaki.mukai](https://swi-prolog.discourse.group/u/kuniaki.mukai)\
**Post date:** [August 30, 2022, 6:44pm UTC](https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726/4 "2022-08-30T18:44:05Z")

</div>

I am not sure if this is for what you are asking, but I feel something related.

```prolog
% ?-	findall(C, student(_, C), Cs), sort(Cs, Cs0),
% findall(L, studies(_, L), Ls), sort(Ls, Ls0),
% findall(X-Y, (	member(X, Cs0),
% member(Y, Ls0),
% forall(student(S, X), studies(S, Y))),
% Ans),
% sort(Ans, Ans0), 
% maplist(writeln, Ans0).
%@ english-hebrew
%@ spanish-english
%@ Cs = [spanish, english, italian, spanish],
%@ Cs0 = [english, italian, spanish],
%@ Ls = [english, portuguese, hebrew, english, hebrew],
%@ Ls0 = [english, hebrew, portuguese],
%@ Ans = Ans0, Ans0 = [english-hebrew, spanish-english].

```

---

<div class="post-metadata">

**Author:** ![unlocked2412](https://avatars.discourse-cdn.com/v4/letter/u/e47c2d/32.png) [@unlocked2412](https://swi-prolog.discourse.group/u/unlocked2412)\
**Post date:** [August 30, 2022, 8:32pm UTC](https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726/5 "2022-08-30T20:32:36Z")

</div>

Thank you, everyone.

This is the final rule:

```prolog
desiredLanguage(X, Y) :- forall(student(S, X), studies(S, Y)).

```

So, I would like to query:

```prolog
?- desiredLanguage(X, Y)

```

and get the possible combinations that make that predicate true. Of course, it’s correct but `forall` predicate doesn’t bind results to variables. Do I have any alternatives ?

---

<div class="post-metadata">

**Author:** ![unlocked2412](https://avatars.discourse-cdn.com/v4/letter/u/e47c2d/32.png) [@unlocked2412](https://swi-prolog.discourse.group/u/unlocked2412)\
**Post date:** [August 30, 2022, 8:32pm UTC](https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726/6 "2022-08-30T20:32:51Z")

</div>

> [@kuniaki.mukai](#):
>
> I am not sure if this is for what you are asking, but I feel something related.

Thank you. How can I test it ?

---

<div class="post-metadata">

**Author:** ![unlocked2412](https://avatars.discourse-cdn.com/v4/letter/u/e47c2d/32.png) [@unlocked2412](https://swi-prolog.discourse.group/u/unlocked2412)\
**Post date:** [August 30, 2022, 8:36pm UTC](https://swi-prolog.discourse.group/t/foreach-2-query-doesnt-bind-results-to-variables/5726/7 "2022-08-30T20:36:07Z")

</div>

> [@kuniaki.mukai](#):
>
> `maplist(writeln, Ans0).`

I was able to run it.
