Я пытаюсь проверить алгоритм, используя Дафни. Я изо всех сил пытаюсь исправить сообщение об ошибке " уменьшает выражение может не уменьшаться (тайм-аут) ". Базовая c структура моего алгоритма выглядит следующим образом:
while (U != {})
decreases |S| - |B - U|; // S is a constant and |B| <= |S|
invariant U < B; // U is a subset of B
{
var u :| u in U; // pick an element of u
U := U - {u}; // remove the element
while (...)
invariant U < B; // U is a subset of B
{
// modifies B and U but does not modify |B - U|
}
}
S, B и U - все множества. S не изменяется вообще в алгоритме. Я доказал, что количество элементов B меньше или равно количеству элементов S, поэтому условие уменьшения связано с нулем.
После каждого присваивания либо B, либо U (во внутреннем, тогда как l oop) Я могу доказать, что | B - U | остается такой же. Однако этого недостаточно, мне нужен инвариант al oop во внутреннем пространстве, в то время как l oop говорит об этом, но я не знаю, как express это в Дафни. Я пробовал следующее, но это не решило проблему:
invariant |old(B) - old(U)| == |B - U|;
(Примечание: я впервые использую Dafny, и я застрял на этой проблеме в течение недели, любые предложения будут быть полезным).