/** ?- traverse([i,am,happy],[[i,eat,apple],[apple,makes_me,happy]],Facts2). Yes traverse([i, am,happy],[[i,eat,apple],[apple,makes_me,happy], [i, eat, appleseed], [appleseed, is_in, apple]], _L207). **/ /** traverse(+Proposition,+Facts,-Facts2) Proposition is form [Subject,Verb,Object] Facts is in form of list of [Proposition] **/ %%traverse(_,[],_):-fail. traverse([Subject,_,Object],Facts,Facts2) :- traverse1(Subject,Object1,Facts,Facts1), traverse1(Object1,Object,Facts1,Facts2). /** traverse(+Proposition,+Facts,-Facts2) As for traverse **/ traverse1(Subject,Object,Facts,Facts3) :- delete(Facts,[Subject,_,Object],Facts2), traverse2([Subject,_,Object],Facts2,Facts3),!. /** %%traverse2(_,[],_):-fail. traverse2([+Proposition,+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)).