/** ?- traverse([i,happy],[[i,apple],[apple,happy]],_). Yes traverse([i,happy],[[i,apple],[apple,happy], [i,appleseed], [appleseed,apple]], _). **/ /** traverse(+Pair,+Facts,-Facts2) Pair is form [Subject,Object] Facts is in form of list of pairs **/ traverse([Subject,Object],Facts,Facts2) :- traverse1(Subject,Object1,Facts,Facts1), traverse1(Object1,Object,Facts1,Facts2). /** traverse(+Pair,+Facts,-Facts2) As for traverse/1 **/ traverse1(Subject,Object,Facts,Facts3) :- delete(Facts,[Subject,Object],Facts2), traverse2([Subject,Object],Facts2,Facts3),!. /** traverse2([+Pair,+Terminator],+Facts,-Facts1) where terms are described as for traverse/1. **/ traverse2([Subject,Object],Facts,Facts3) :- member([Subject,Object1],Facts), member([Object1,Object],Facts), traverse([Subject,Object],Facts,Facts3). traverse2([Subject,Object],Facts,Facts) :- not(member([Subject,Object1],Facts)), not(member([Object1,Object],Facts)).