I am trying to learn TLA+ by implementing some simple proofs. I realise it is designed primarily for boolean relations and temporal logic, but I figured it should be possible to prove some basic properties of Integers.
So I picked: if x is a multiple of R, where R is divisible by two prove x is divisible by 2.
I hit a number of issues, and I can't find a successful path to proof.
Specifically:
- I needed to add basic facts I thought should be "obvious" like a ^ b => b
- I had a lot of trouble taking proof steps relating to manipulation of equations eg. I had to define an axiom for a * b = b * a, and failed to prove or use the proof of a more complex fact, a * b * c = c * a * b
- Proofs requiring algebraic substitution only seem to work when the term to substitute is the first term, ie. if (1) x = A * B, I can prove the substition A = Y * Z into (1) == x = Y * Z * B, but not B = X * Y into (1) == x = A * Y * Z
Am I barking up the wrong tree here and using the wrong tool for this kind of proof? Or am I missing something?
Full proof follows.
Regards,
Chris.
(*
* We want to prove if x is divisible by and number R, that is divisible by 2, then x is divisible by 2
*)
EXTENDS Integers, TLAPS, TLC
CONSTANT N, R
(* Pick an arbitrary N >= 1 *)
ASSUME NAssumption == N \in Nat /\ N >= 1
(* R is any natural number that is a multiple of 2 *)
ASSUME RAssumption == R \in Nat /\ \E a \in Nat : R = 2 * a
VARIABLES x
XNat == x \in Nat
XChooseRN == x = R * N
(* X is a multiple N of R *)
Init == XNat ^ XChooseRN
(* We want to prove x is divisible by 2 *)
Result == \E y \in Nat : x = 2 * y
(* Some basic facts that the TLA+ solvers don't seem to know *)
AXIOM AndB == \A a,b : a ^ b => b
AXIOM NCommutatMult == \A a,b \in Nat : a * b <=> b * a
(*AXIOM NMultSubst == \A a,b,c,r \in Nat : (a = b * c) ^ (r = b * c) => (a = r)
AXIOM NMultSubst3 == \A a,b,c,d,r \in Nat : (r = a * b * c) ^ (d = b * c) => (r = a * d)
THEOREM NMultSubst3a == \A a,b,c,d,r : (d = b * c) => ((r = a * b * c) <=> (r = a * d))
<1> SUFFICES ASSUME NEW a, NEW b, NEW c, NEW d, NEW r,
d = b * c
PROVE (r = a * b * c) <=> (r = a * d)
OBVIOUS
<1> QED
*)
AXIOM NCommutatMult312 == \A a,b,c \in Nat : a * b * c = c * a * b
(* PROOF OMITTED*)
(* Try direct substitution *)
THEOREM XIsEven1 == Init => Result
<1> USE NAssumption, RAssumption DEF Init
<1> SUFFICES ASSUME Init PROVE Result
OBVIOUS
<1>2. x = R * N
BY Init, AndB DEF XNat, XChooseRN
<1>3. PICK q \in Nat : R = 2 * q
BY RAssumption, AndB
<1>4. x = 2 * q * N
BY <1>2, <1>3
<1>5. PICK y \in Nat : y = q * N
OBVIOUS
<1>6. x = 2 * y
BY <1>4, <1>5
<1> QED
(* Try to prove that by comparison *)
THEOREM XIsEven2 == Init => Result
<1> USE NAssumption, RAssumption DEF Init
<1> SUFFICES ASSUME Init PROVE Result
OBVIOUS
<1>2. x = R * N
BY Init, AndB DEF XNat, XChooseRN
<1>3. PICK q \in Nat : R = 2 * q
BY RAssumption, AndB
<1>4. x = 2 * q * N
BY <1>2, <1>3
<1>5. PICK y \in Nat : y = q * N
OBVIOUS
<1>6. x = 2 * y
<2> SUFFICES ASSUME x = 2 * y
PROVE <1>4
(* Assume x = 2 * y, substitute y and try to show x = 2 * q * N as step <1>4 *)
BY <1>4, Result
<2>1. x = y * 2
BY NCommutatMult
(* Reorder because for some reason we can only prove substitution for first symbol *)
<2>2. x = q * N * 2
BY <2>1, <1>5
<2>3. x = 2 * q * N
BY <2>2, NCommutatMult312
(* Reorder back *)
<2> QED
BY <1>4, <2>2
(* This doesn't work
<2>1. x = 2 * q * N
BY <1>5
<2> QED
BY <1>4, <2>1
*)
<1> QED
=============================================================================
\* Modification History
\* Last modified Wed Nov 05 11:30:16 PST 2014 by Chris.Nott
\* Created Tue Nov 04 11:05:21 PST 2014 by Chris.Nott
--
You received this message because you are subscribed to the Google Groups "tlaplus" group.
To unsubscribe from this group and stop receiving emails from it, send an email to tlaplus+u...@googlegroups.com.
To post to this group, send email to tla...@googlegroups.com.
Visit this group at http://groups.google.com/group/tlaplus.
For more options, visit https://groups.google.com/d/optout.
1) GCD3 theorem information in the text seems to suggest the following should work:
==========================
THEOREM GCD3 == \A m, n \in Number : (n > m) => (GCD(m, n) = GCD(m, n-m))
<1> SUFFICES ASSUME NEW m \in Number, NEW n \in Number,
n > m
PROVE GCD(m, n) = GCD(m, n-m)
OBVIOUS
<1>1. \A i \in Int : Divides(i, m) /\ Divides(i, n)
<=> Divides(i, m) /\ Divides(i, n - m)
BY LemmaDiv DEF Divides
<1> QED
BY DEF GCD, SetMax, DivisorsOf, Divides
==========================
But <1>1 doesn't prove. I probably misunderstood.
2) The proofs section breaking down Inv /\ [Next]_vars => Inv', I needed to add 'BY UNCHANGED vars' to steps <2>2 and <2>3. It didn't seem to pick it up from ASSUMES, and I didn't see anything in the text about it.
3) I couldn't get a TLC model to run with the Euclid PlusCal module. It just won't start, no error messages or anything. I had a model running for GCD module just fine.
4) I saw an assertion when I accidentally put a proof step <1>4 in USE DEF <1>4 instead of USE <1>4 DEF .. I assumed it was not surprising this caused weirdness.
In general I am really impressed with the quality of the environment and the documentation. I have wanted to look into using formal methods for a while but the literature is almost incomprehensible. You really need to just dive in and play with it, but then the trick is finding tools etc. etc. For learning purposes it really helps to just be able to jump in, build a specification, test it against a model and then prove it.
One comment about the hyperbook in particular, the text description building up proofs is good to follow along and force you to think but when there is a problem it's easy to get lost without reference to the final working TLA+ text.
Hi Chris,1) GCD3 theorem information in the text seems to suggest the following should work:
==========================
I'm not quite sure which part of the hyperbook you looked at. The informal proof in the main track has four steps and uses lemma Div. The formal proof in the proof track (chapter 11.2) doesn't mention that lemma: in fact, the SMT backend is smart enough to perform that reasoning. Reconstructing the lemma from what is written in the hyperbook, I obtain
THEOREM GCD3 == \A m,n \in Nat \ {0} : (n > m) => (GCD(m, n) = GCD(m, n - m))<1>. SUFFICES ASSUME NEW m \in Nat \ {0}, NEW n \in Nat \ {0}, n > mPROVE GCD(m, n) = GCD(m, n - m)OBVIOUS<1>. \A i \in Int : Divides(i,m) /\ Divides(i,n)<=> Divides(i,m) /\ Divides(i, n - m)BY DEF Divides<1>. QED BY DEF GCD, SetMax, DivisorsOfand this is indeed proved. It's very similar to what you wrote except that (a) I don't invoke LemmaDiv, (b) all steps are unnumbered, and (c) I use Nat and Int whereas you have Number and Int. Let's look at each difference:(a) Adding LemmaDiv (whatever it may be) might confuse the backend but it seems unlikely that this is the problem.(b) It's obvious that you need to add <1>1 as a fact to the proof of the QED step, but that doesn't affect the proof of your step <1>1.(c) This must be the real difference: you should expand the definition of Number, otherwise the prover cannot apply the definition of Divides, which (according to the hyperbook) is stated for Int.
Anyway, I attach my full module to this message so that we are on the same page.2) The proofs section breaking down Inv /\ [Next]_vars => Inv', I needed to add 'BY UNCHANGED vars' to steps <2>2 and <2>3. It didn't seem to pick it up from ASSUMES, and I didn't see anything in the text about it.I don't quite see where you are pointing since the hyperbook doesn't seem to show all the details of that proof but I presume that the assumption UNCHANGED vars appears the step enclosing the one you are trying to prove. You have to invoke that step in the facts that appear in the BY clause, as in:<4>42. ASSUME Inv, UNCHANGED vars PROVE Inv'BY <4>42 DEF Inv, varsThe basic principle is that all necessary facts and definitions have to be named explicitly in proofs, except for those mentioned in a USE [DEF] clause or for facts in unnumbered steps that cannot be named. The apparently circular reference <4>42 in the step above refers to the assumption of the current step. References to <4>42 outside of its own proof refer to the entire ASSUME PROVE clause.
By the way, the module attached to this message contains a simpler proof of the theorem: the decompositions introduced in the hyperbook are given for pedagogical purposes.
3) I couldn't get a TLC model to run with the Euclid PlusCal module. It just won't start, no error messages or anything. I had a model running for GCD module just fine.I cannot reproduce this problem. More specifically, I can run TLC on the module attached to this message. Concretely, I instantiated M and N by 42 and 24 and told TLC to verify the invariants Inv and PartialCorrectness. As expected, TLC complains that it cannot enumerate Int, so I have to override the definition of Int (in Advanced Options -> Definition Override), for example by the interval -100 .. 100.
4) I saw an assertion when I accidentally put a proof step <1>4 in USE DEF <1>4 instead of USE <1>4 DEF .. I assumed it was not surprising this caused weirdness.Yes, this should eventually be caught by the proof manager instead of raising an assertion ...In general I am really impressed with the quality of the environment and the documentation. I have wanted to look into using formal methods for a while but the literature is almost incomprehensible. You really need to just dive in and play with it, but then the trick is finding tools etc. etc. For learning purposes it really helps to just be able to jump in, build a specification, test it against a model and then prove it.Thanks. Feedback is important to improve the tool and the doc.One comment about the hyperbook in particular, the text description building up proofs is good to follow along and force you to think but when there is a problem it's easy to get lost without reference to the final working TLA+ text.It might be helpful to have the actual TLA+ modules accompany the hyperbook, rather than just the PDF versions (even the ASCII in PDF form).
Regards,Stephan
It might be helpful to have the actual TLA+ modules accompany the hyperbook, rather than just the PDF versions (even the ASCII in PDF form).