Я использую решатель Z3 SMT от Microsoft и пытаюсь определить константы пользовательского вида. Кажется, что такие константы по умолчанию не являются неравными. Предположим, у вас есть следующая программа:
(declare-sort S 0)
(declare-const x S)
(declare-const y S)
(assert (= x y))
(check-sat)
Это даст «sat», потому что вполне возможно, что две константы одного и того же типа равны. Поскольку я делаю модель, в которой константы должны отличаться друг от друга, это означает, что мне нужно будет добавить аксиому вида
(assert (not (= x y)))
для каждой пары констант одного и того же вида. Мне было интересно, есть ли способ сделать это общим, чтобы каждая константа сортировки была уникальной по умолчанию.