Не уверен, что это то, что вы имели в виду, но как насчет следующего:
alternate(first, pair(X,_), X).
alternate(second, pair(_,X), X).
Если вы делаете запрос без каких-либо ограничений, вы получаете следующие две замены ответа:
?- alternate(X,Y,Z).
X = first,
Y = pair(Z, _5844) ; % hit ; to get the second answer
X = second,
Y = pair(_5842, Z). % variables _12345 are fresh ones created by prolog
Вы также можете спросить: на какой стороне пары (a, b) находится b?
?- alternate(Where, pair(a,b), b).
Where = second.
В случае, если ваша пара (b, b), вы получаете два решения:
?- alternate(Where, pair(b,b), b).
Where = first ;
Where = second.
Кроме того, c не является частью пары (a, b):
?- alternate(Where, pair(a,b), c).
false.
Если вы настаиваете на выборе элемента с небес, вы получите «нет» в качестве ответа:
?- alternate(heaven, X, Y).
false.
Когда вы знаете, что первым элементом пары является a, пролог скажет вам, как должна выглядеть пара:
?- alternate(first, X, a).
X = pair(a, _5680).
Снова у нас есть свежая переменная (_5680), потому что любой второй член в порядке.