Я пытаюсь написать программу на Dafny, вот часть программы:

method GenerateAllIndexSubsets<T>(q: seq<T>) returns (res: set<set<nat>>)
    ensures res == AllIndexSubsets(q)
{
    if |q| == 0
        { 
        assert |q| == 0;// if's guard
        // ==>
        assert {} == AllIndexSubsets<nat>([]);
        assert q == [];
        assert {} == AllIndexSubsets(q);
        res := {};
        assert res == AllIndexSubsets(q); // postcondition
        }
    else
        { 
            assert |q| != 0; // !(if's guard)
            var res0 : set<set<nat>> := GenerateAllIndexSubsets<T>(q[1..]);
            assert res0 == AllIndexSubsets(q[1..]);
            res := res0;    
            assert res ==  AllIndexSubsets(q[1..]); //GenerateAllIndexSubsets postcondition with q[1..]
            var index : nat := q[0];
            var res1: set<set<nat>> := (set x | x in res0 :: x + {index});
            assert res1 == AllIndexSubsets(q) - AllIndexSubsets(q[1..]);
            assert res0 == AllIndexSubsets(q[1..]);
            assert res1 == AllIndexSubsets(q) - res0;
            // ==>
            assert res0 + res1 == AllIndexSubsets(q);
            res := res + res1;
            assert res == AllIndexSubsets(q); // postcondition
        }
    assert res == AllIndexSubsets(q); // postcondition
}

На линии var index : nat := q[0] у меня возникает следующая проблема:

тип не соответствует типу элемента seq (есть int)

Почему я получаю это и как я могу исправить это сейчас и не получить снова в будущем?

1
Snirka 26 Фев 2018 в 00:49

1 ответ

Лучший ответ

q - это последовательность элементов типа T, поэтому q[0] имеет тип T. Но вы пытаетесь присвоить его переменной типа nat, что неверно.

(Причина, по которой в сообщении об ошибке Dafny упоминается int вместо nat, заключается в том, что nat определяется как подмножество int, поэтому для проверки того, является ли что-то { {X4}}, Дафни сначала проверяет, что это int, что здесь не работает.)

0
James Wilcox 26 Фев 2018 в 13:44