How does prolog decides which variables it will look at?

I am wondering another thing. How does Prolog decides which variable to investigate in a complex atom?

This is the problem:
http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse11
This is the code:

directlyIn(irina, natasha).
directlyIn(natasha, olga).
directlyIn(olga, katarina).
in(X,Z):-directlyIn(X,Y),in(Y,Z).

This is the trace:

[trace]  ?- in(irina,katarina).
   Call: (8) in(irina, katarina) ? creep
   Call: (9) directlyIn(_6198, irina) ? creep
   Fail: (9) directlyIn(_6198, irina) ? creep
   Fail: (8) in(irina, katarina) ? creep
false.

Why does Prolog puts irina in second position, and does not look at in(irina, _6198). ?

The code that you’re tracing doesn’t seem to be the code that you’re listing:

?- [user].
|: directlyIn(irina, natasha).
|: directlyIn(natasha, olga).
|: directlyIn(olga, katarina).
|: in(X,Z):-directlyIn(X,Y),in(Y,Z).
|: ^D% user://1 compiled 0.00 sec, 4 clauses
true.

?- trace.
true.

[trace]  ?- in(irina,katarina).
   Call: (10) in(irina, katarina) ? creep
   Call: (11) directlyIn(irina, _8600) ? creep
   Exit: (11) directlyIn(irina, natasha) ? creep
   Call: (11) in(natasha, katarina) ? creep
   Call: (12) directlyIn(natasha, _8600) ? creep
   Exit: (12) directlyIn(natasha, olga) ? creep
   Call: (12) in(olga, katarina) ? creep
...
1 Like

Really? Sorry, I thought I reloaded.

I redid it now:

[trace]  ?- in(irina,katarina).
   Call: (8) in(irina, katarina) ? creep
   Call: (9) directlyIn(irina, _6200) ? creep
   Exit: (9) directlyIn(irina, natasha) ? creep
   Call: (9) in(natasha, katarina) ? creep
   Call: (10) directlyIn(natasha, _6200) ? creep
   Exit: (10) directlyIn(natasha, olga) ? creep
   Call: (10) in(olga, katarina) ? creep
   Call: (11) directlyIn(olga, _6200) ? creep
   Exit: (11) directlyIn(olga, katarina) ? creep
   Call: (11) in(katarina, katarina) ? creep
   Call: (12) directlyIn(katarina, _6200) ? creep
   Fail: (12) directlyIn(katarina, _6200) ? creep
   Fail: (11) in(katarina, katarina) ? creep
   Fail: (10) in(olga, katarina) ? creep
   Fail: (9) in(natasha, katarina) ? creep
   Fail: (8) in(irina, katarina) ? creep
false.

I guess this is false because I do not have a stop condition?

1 Like

Indeed you have a recursive definition for the in/2 predicate without a base case. Try adding as the first clause for the predicate:

in(X, Y) :- directlyIn(X, Y).
1 Like