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

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -