(==)/2 does the 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 that facts pair/2 don't play any role in your program, and that you should query a variable shared (I used N2
instead of P2
).
Also, why all those cuts at rules' end ? Useless cuts are often dangerous.