i encounter a problem with facts. Let's say i got 3 facts and check(X)
question.
fact(a,b).
fact(b,c).
fact(a,d).
check(X):-
//some calculation with fact()
How to make above question to return list of elements for given X
from all facts?
For instance: check(a)
would give result b
and d
. So i can use this const later.
check(b)
would return c
. I would be grateful for help!
You need an extra argument for the list. So you cannot call it check/1
having a single argument, but — let's say — related_to/2
.
related_to(X, Ys) :-
setof(Y, fact(X, Y), Ys).
Sample queries:
?- related_to(a, Xs).
Xs = [b, d].
?- related_to(b, Xs).
Xs = [c].
?- related_to(d, Xs).
false.
?- related_to(X, Xs).
X = a, Xs = [b,d]
; X = b, Xs = [c].
Note that the relation will fail for inexistent nodes like d
above. On the other hand, you can even ask the most general goal getting all possible answers at once.
Also note that this relation is not monotone: If you add further facts, previously obtained results no longer hold. Like by adding fact(a,f)
the goal related_to(a, [b,d])
no longer holds. Instead related_to(a,[b,d,f])
now holds.