Если предикаты сохраняют порядок в массивах (например, в вашем примере, если все значения гарантированно неотрицательны), вы можете адаптировать алгоритм слияния. Рассмотрим ключ для каждого массива как конечное значение (то, что вы получите после применения предиката столько раз, сколько необходимо для всех массивов).
Если предикат не сохраняет порядок (или массивы не упорядочены для запуска), вы можете сначала отсортировать по конечному значению, но необходимость сделать это предполагает, что другой подход может быть лучше (например, хэш таблицы, предложенные в другом месте).
В основном, проверьте, равно ли следующее конечное значение для всех массивов. Если нет, перешагните через самое низкое (только в одном массиве) и повторите. Если все три равны, то это (возможное) решение - перешагните через все три, прежде чем искать следующий.
«Возможное» решение, потому что вам может потребоваться выполнить проверку - если функция предиката может сопоставить более одного входного значения с одним и тем же выходным значением, может возникнуть случай, когда значение найдено в некоторых массивах (но не в первом или последнее) неправильно.
EDIT - могут быть большие проблемы, когда предикат не сопоставляет каждый вход с уникальным выходом - в данный момент не может думать. По сути, подход слияния может работать хорошо, но только для определенных типов предикатов.