prolog - Finding values without creating new unifications -
i have set of definitions of form pair/2
, predicate propagate/3
:
pair(1, 2). pair(2, 3). pair(3, 4). pair(4, 5). propagate([], _, []) :- !. propagate([pair(n, num)|tail], num, [n|resulttail]) :- propagate(tail, num, resulttail), !. propagate([pair(num, n)|tail], num, [n|resulttail]) :- propagate(tail, num, resulttail), !. propagate([_|tail], num, result) :- propagate(tail, num, result), !.
if have list = [pair(1, 2), pair(2, 3), pair(3, 4), pair(4, 5)]
, do
propagate(list, 2, result).
i desired output, result = [1, 3]
; i.e. list of numbers form pair 2
.
however, if have list = [pair(n1, n2), pair(n2, n3), pair(n3, n4), pair(n4, n5)]
, if do
propagate(list, n2, result)
then output
n2 = n3, n3 = n4, n4 = n5, result = [n1, n5, n5, n5].
i output result = [n1, n3]
, instead. how can that?
(==)/2 trick
propagate([], _, []) :- !. propagate([pair(n, x)|tail], num, [n|resulttail]) :- x == num, propagate(tail, num, resulttail), !. propagate([pair(x, n)|tail], num, [n|resulttail]) :- x == num, propagate(tail, num, resulttail), !. propagate([_|tail], num, result) :- propagate(tail, num, result), !.
yields
?- list = [pair(n1, n2), pair(n2, n3), pair(n3, n4), pair(n4, n5)], propagate(list,n2,result). list = [pair(n1, n2), pair(n2, n3), pair(n3, n4), pair(n4, n5)], result = [n1, n3].
note facts pair/2 don't play role in program, , should query variable shared (i used n2
instead of p2
).
also, why cuts @ rules' end ? useless cuts dangerous.
Comments
Post a Comment