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