2
Wie kann ein Dafny-Prädikat weder wahr noch falsch sein?Dafny-Prädikat weder wahr noch falsch
Dies:
predicate sorted(s: seq<int>)
{
forall j, k :: 0 <= j < k < |s| ==> s[j] <= s[k]
}
lemma SortedTest()
{
assert sorted([1, 3, 2]);
assert !sorted([1, 3, 2]);
}
Erzeugt doppelte Behauptung Verletzungen:
Dafny program verifier version 1.9.7.30401, Copyright (c) 2003-2016, Microsoft.
Sort.dfy(8,10): Error: assertion violation
Sort.dfy(3,2): Related location
Sort.dfy(3,43): Related location
Execution trace:
(0,0): anon0
Sort.dfy(9,9): Error: assertion violation
Execution trace:
(0,0): anon0
Dafny program verifier finished with 2 verified, 2 errors
Vielen Dank! Das scheint ein seltsamer Hinweis zu sein, den ich geben muss. :-) – Calder
Es hat damit zu tun, wie der Heap in Dafny kodiert ist. Im Wesentlichen entrollt Dafny normalerweise induktive Definitionen nur einmal automatisch. Daher wird es normalerweise nur das zuletzt zugewiesene Element des Arrays auswählen, um die Quantifizierer zu instantiieren (dh das einzige Element, das im Heureiter _current_ zugewiesen wurde), es sei denn, Sie tun etwas (wie die Behauptung, die ich geschrieben habe), die die anderen relevanten Elemente verursacht im Solver e-Graph für den aktuellen Heap. Nach meiner Erfahrung ist es tatsächlich besser, mit Formeln (Arrays im Allgemeinen) als mit konkreten Werten (einem bestimmten Array) umzugehen. – lexicalscope
Gibt es eine Möglichkeit, den Unterschied zwischen "Ich kann beweisen, dass es falsch ist" und "Ich kann nicht beweisen, dass es richtig ist" zu unterscheiden? –