Сравните модель с реализацией в 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.

Другие вопросы по тегам