-
Notifications
You must be signed in to change notification settings - Fork 71
Description
(In order to reproduce this bug, you'll need to install Kind2-0.7.2, which is (as far as I can tell) the latest version of Kind2 that copilot-theorem
currently supports. Note that Kind2-0.7.2 doesn't offer binary distributions, so you'll have to build it from source.)
copilot-theorem
's kind2Prover
is able to prove properties that are true. For instance, running this program:
module Main (main) where
import Data.Functor
import Copilot.Theorem.Kind2
import Copilot.Theorem.Prove
import Language.Copilot
spec :: Spec
spec =
void $ theorem "true" (forAll true) (check (kind2Prover def))
main :: IO ()
main = void $ reify spec
Will yield:
(define-pred top
((prop-true.out Bool))
(init
(= prop-true.out true))
(trans
(= (prime prop-true.out) true)))
(check-prop
((true prop-true.out)))
true: valid ()
Finished: true: proof checked successfully
On the other hand, if kind2Prover
attempts to disprove a property that is false, then it will crash with a parse error. This can be seen when running this program:
module Main (main) where
import Data.Functor
import Copilot.Theorem.Kind2
import Copilot.Theorem.Prove
import Language.Copilot
spec :: Spec
spec =
void $ theorem "false" (forAll false) (check (kind2Prover def))
main :: IO ()
main = void $ reify spec
(define-pred top
((prop-false.out Bool))
(init
(= prop-false.out false))
(trans
(= (prime prop-false.out) false)))
(check-prop
((false prop-false.out)))
Main.hs: Parse error while reading the Kind2 XML output :
Unrecognized status : falsifiable
<?xml version="1.0"?>
<Results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Log class="info" source="parser">kind2 v0.7.2</Log>
<Property name="false">
<Runtime unit="sec" timeout="false">0.135</Runtime>
<K>1</K>
<Answer source="bmc">falsifiable</Answer>
<Counterexample></Counterexample>
</Property>
</Results>
CallStack (from HasCallStack):
error, called at src/Copilot/Theorem/Misc/Error.hs:32:9 in copilot-theorem-3.18.1-inplace:Copilot.Theorem.Misc.Error
The problem lies in this code:
copilot/copilot-theorem/src/Copilot/Theorem/Kind2/Output.hs
Lines 19 to 24 in 835deaf
parseOutput prop xml = fromJust $ do | |
root <- parseXMLDoc xml | |
case findAnswer . findPropTag $ root of | |
"valid" -> return (Output Valid []) | |
"invalid" -> return (Output Invalid []) | |
s -> err $ "Unrecognized status : " ++ s |
This expects Kind2's XML output to have an <Answer>...</Answer>
tag whose content is the string invalid
. As can be seen in the XML output that is dumped in the error message above, however, the actual content of the <Answer>
tag is falsifiable
.
Resolving this issue would be helpful in an eventual resolution for #254. In order to check an existentially quantified property with Kind2, it would be convenient to take a universally quantified property and negate it, checking if Kind2 returns falsifiable
as the answer. This won't be possible unless we first fix this issue.