not sure about this solution, but a simpler representation of the knowledge surely helps:
has(car, pa, n). has(boat, pa, y).
has(boat, pb, n). has(plane, pb, y).
has(plane, pc, n). has(bike, pc, y).
has(bike, pd, n). has(car, pd, y).
has(bike, X, y) :- has(car, X, n), has(plane, X, n).
has(car, X, y) :- has(plane, X, n), has(bike, X, y).
has(truck, X, y) :- has(plane, X, n), has(car, X, y).
has(plane, X, n) :- has(truck, X, n), has(boat, X, y).
has(car, X, n) :- has(boat, X, n), has(plane, X, y).
now we can query what's the ownerships (that note it's a one to many relation)
?- setof((P,T,R), has(T,P,R), L), maplist(writeln, L).
pa,boat,y
pa,car,n
pb,boat,n
pb,car,n
pb,plane,y
pc,bike,y
pc,car,y
pc,plane,n
pc,truck,y
pd,bike,n
pd,car,y
L = [ (pa, boat, y), (pa, car, n), (pb, boat, n), (pb, car, n), (pb, plane, y), (pc, bike, y), (pc, car, y), (pc, ..., ...), (..., ...)|...].
Note I placed the P
erson before the T
ransport, then we can inspect visually the result...
Seems that the solution is a triple...