1:- module(pathlang,
    2          []).    3
    4prim_goal(Pred, X, Y, Goal) :-
    5        var(Pred),
    6        !,
    7        Goal = rdf(X, PredIRI, Y).
    8prim_goal(inverse(Pred), X, Y, Goal) :-
    9        !,
   10        prim_goal(Pred, Y, X, Goal).
   11prim_goal(Pred, X, Y, Goal) :-
   12        rdf_global_id(Pred,PredIRI),
   13        rdf_is_iri(PredIRI),
   14        !,
   15        Goal = rdf(X, PredIRI, Y).
   16prim_goal(Pred, X, Y, Goal) :-
   17        !,
   18        Goal =.. [Pred, X, Y].
   19                   
   20eval( A -> B, Goal ) :-
   21        % assume head term is an object
   22        eval( A, B, Goal ).
   23
   24eval( A, B -> C, (Goal, Goal2) ) :-
   25        % e.g. A, has_friend -> lives_in ==> has_friend(A, Out), lives_in(Out, ...)
   26        \+ compound(B),
   27        !,
   28        prim_goal(B, A, Out, Goal),
   29        eval(Out, C, Goal2).
   30
   31eval( A, B -> C, (Goal, Goal2) ) :-
   32        % e.g. A, has_friend(Friend) -> lives_in ==> has_friend(A, Friend), lives_in(Friend, ...)        
   33        compound(B),
   34        !,
   35        B =.. [Pred, Out],
   36        prim_goal(Pred, A, Out, Goal),
   37        eval(Out, C, Goal2).
   38
   39eval( A, (B,C), (Goal, Goal2) ) :-
   40        !,
   41        eval(A, B, Goal),
   42        eval(A, C, Goal2).
   43
   44eval( A, (B | C), (Goal ; Goal2) ) :-
   45        !,
   46        eval(A, B, Goal),
   47        eval(A, C, Goal2)