В некотором смысле SMT «естественно» поддерживает реляционное программирование. Вы можете просто отключить возможные значения аргумента и, таким образом, достичь желаемого результата. Что-то вроде:
(declare-fun foo ((Int)) Int)
(assert (or (= (foo 3) 4) (= (foo 3) 5)))
(check-sat)
(eval (foo 3)) ; might produce 4 of 5
(assert (distinct (foo 3) 4))
(check-sat)
(eval (foo 3)) ; will produce 5
(assert (distinct (foo 3) 5))
(check-sat) ; will declare unsat
Here're вы говорите foo
применительно к 3
, может производить 4
или 5
. И тогда вы можете утверждать «дальнейшие» факты, чтобы ограничить пространство по мере необходимости; или оставить его свободным. Вы можете использовать этот трюк, чтобы по существу моделировать foo
как отношение; заставляя SMT-решателя вести себя как язык реляционного программирования.
Конечно, как вы действительно хотите заниматься модельными отношениями, действительно зависит от проблемы. Вышеупомянутое может быть не лучшим выбором для вашей проблемы.
Большое спасибо за ваш ответ. Я рассмотрю учебник. Теоретически это сработает для меня. Благодаря! – Fathiyeh