Возможно, вы смешиваете понятия предикатов и понятия множеств. У вас хорошая компания (например, Фреге), но она оказывается опасной.
Выражения o in A[o]
и o in B[o]
должны вызывать ошибку типа, так как если A и B являются предикатами, то выражения A[o]
и B[o]
должны оцениваться как истинные или ложные, а не как множества, членом которых предположительно может быть o.
Если вам нужен предикат U, который истинен для объекта, когда для этого объекта истинны либо A, либо B, либо оба, то вам нужно что-то вроде
pred U[o : Object] { A[o] or B[o] }
И если вам нужна исключительная дизъюнкция — я предполагаю, что вы имеете в виду это, когда говорите о дизъюнктном союзе, — тогда
pred X[o : Object] { (A[o] and not B[o]) or (B[o] and not A[o]) }
Если вам нужны наборы, для которых A, B и X истинны, то вы хотите написать
{ o : Object | A[o] }
{ o : Object | B[o] }
{ o : Object | X[o] }
Третье из них, конечно, можно записать
{ o : Object | (A[o] and not B[o]) or (B[o] and not A[o]) }
Нотация понимания множества (опять же, я рекомендую вам прочитать соответствующую документацию) также может обрабатывать наборы кортежей; декартово произведение множеств объектов, удовлетворяющих A и B, будет записано так:
{ a, b : Object | A[a] and B[b] }
person
C. M. Sperberg-McQueen
schedule
06.12.2014