Конечно:
from z3 import *
Object, (a, b, c) = EnumSort('Object', ('a', 'b', 'c'))
connections = [(a, b), (a, c)]
def isConnected(x, y):
return Or([And(x == i, y == j) for (i, j) in connections])
s = Solver()
s.add(isConnected(a, b))
s.add(isConnected(a, c))
print(s.check())
s.add(isConnected(b, c))
print(s.check())
Первый print
скажет sat
, а второй скажет unsat
, поскольку b
и c
не связаны.
Вы можете легко обобщить это на любое количество объектов. Или даже сделайте что-то вроде:
s = Solver()
p = Const('p', Object)
q = Const('q', Object)
s.add(isConnected(p, q))
print(s.check())
print(s.model())
, который будет печатать:
sat
[q = b, p = a]
, но обратите внимание, что это назначение никогда не будет содержать пару b
, c
в соответствии с запросом.