Сравните модель с реализацией в Redex
Я работаю над созданием в Redex модели системы типов, которая также имеет каноническую реализацию. Я хотел бы использовать redex-check для нечеткого тестирования моей модели против фактической реализации.
Реализация (с адаптером) может взять мой абстрактный синтаксис, поэтому мне нужен способ передачи термина, сгенерированного фаззером, в реализацию. Есть ли способ сделать это?
1 ответ
Как выясняется redex-check
в сочетании с apply-reduction-relation*
обрабатывает это напрямую, если вы можете либо дать условия redex вашей фактической реализации, либо преобразовать их в соответствии с вашей реализацией. Ваш код будет выглядеть примерно так:
(redex-check λv e
(equal? (implementation (convert (term e)))
(first (apply-reduction-relation* red (term e)))))
куда implementation
ваша реализация, red
является ли отношение сокращения вашей моделью, и convert
преобразует термин во что-то, что ваша реализация может обработать. Также λv
это ваш язык и e
это термин на вашем языке, который вы хотите проверить.
first
просто потому что apply-reduction-relation*
возвращает список всех возможных сокращений. Если ваша модель является детерминированной, это должен быть список длиной один. (Что вы можете проверить, используя вместо этого следующее соотношение сокращения:
(redex-check λv e
(let ([result (apply-reduction-relation* red (term e))])
(and (= (length result) 1)
(equal? (implementation (convert (term e)))
(first result)))))
Вы можете увидеть еще один пример того, как использовать redex-check
на учебнике на домашней странице redex.