Getting list of solutions in Prolog -
i learning prolog , reading book called programming prolog artificial intelligence. practice want learn how extend 1 of examples in book. can please help?
say have these facts:
parent(pam, bob). %pam parent of bob parent(george, bob). %george parent of bob
how write prolog predicate give me list of bobs parents? example:
list_parents(bob, l). l = [pam, george] ; l = [george, pam] ; true.
an all-solutions predicate findall/3
might trick:
list_parents(p, l) :- findall(parent, parent(parent, p), l).
simply put, findall/3
finds bindings parent
in 'backtrack-able' goal parent(parent, p)
, , puts bindings of parent
list l
. note won't remove duplicates, can sort/2
l
before returning create set. executing this:
?- list_parents(bob, l). l = [pam, george].
if don't have findall/3
in prolog implementation, manually this:
list_parents(p, l) :- list_parents(p, [], l). list_parents(p, acc, l) :- parent(parent, p), \+ member(parent, acc), !, list_parents(p, [parent|acc], l). list_parents(_, l, l).
this version sends calls list_parents/2
off accumulator-version, list_parents/3
. latter tries collect parent
bindings also, long haven't seen them before (hence \+ member
check), , returns list no new parent
bindings accumulated acc
list can found. executing gives same result first option:
?- list_parents(bob, l). l = [pam, george].
Comments
Post a Comment