text‹
This theory is intended to showcase and test different features of the ‹argo› proof method.
The ‹argo› proof method can be applied to propositional problems, problems involving equality
reasoning and problems of linear real arithmetic.
The ‹argo› proof method provides two options. To specify an upper limit of the proof methods
run time in seconds, use the option ‹argo_timeout›. To specify the amount of output, use the
option ‹argo_trace› with value ‹none› for no tracing output, value ‹basic› for viewing the
underlying propositions and some timings, and value ‹full› for additionally inspecting the
proof replay steps. ›
declare[[argo_trace = full]]
subsection‹Propositional logic›
notepad begin have"True"by argo next have"~False"by argo next fix P :: bool assume"False" thenhave"P"by argo next fix P :: bool assume"~True" thenhave"P"by argo next fix P :: bool assume"P" thenhave"P"by argo next fix P :: bool assume"~~P" thenhave"P"by argo next fix P Q R :: bool assume"P & Q & R" thenhave"R & P & Q"by argo next fix P Q R :: bool assume"P & (Q & True & R) & (Q & P) & True" thenhave"R & P & Q"by argo next fix P Q1 Q2 Q3 Q4 Q5 :: bool assume"Q1 & (Q2 & P & Q3) & (Q4 & ~P & Q5)" thenhave"~True"by argo next fix P Q1 Q2 Q3 :: bool assume"(Q1 & False) & Q2 & Q3" thenhave"P::bool"by argo next fix P Q R :: bool assume"P | Q | R" thenhave"R | P | Q"by argo next fix P Q R :: bool assume"P | (Q | False | R) | (Q | P) | False" thenhave"R | P | Q"by argo next fix P Q1 Q2 Q3 Q4 :: bool have"(Q1 & P & Q2) --> False | (Q3 | (Q4 | P) | False)"by argo next fix Q1 Q2 Q3 Q4 :: bool have"Q1 | (Q2 | True | Q3) | Q4"by argo next fix P Q R :: bool assume"(P & Q) | (P & ~Q) | (P & R) | (P & ~R)" thenhave"P"by argo next fix P :: bool assume"P = True" thenhave"P"by argo next fix P :: bool assume"False = P" thenhave"~P"by argo next fix P Q :: bool assume"P = (~P)" thenhave"Q"by argo next fix P :: bool have"(~P) = (~P)"by argo next fix P Q :: bool assume"P"and"~Q" thenhave"P = (~Q)"by argo next fix P Q :: bool assume"((P::bool) = Q) | (Q = P)" thenhave"(P --> Q) & (Q --> P)"by argo next fix P Q :: bool assume"(P::bool) = Q" thenhave"Q = P"by argo next fix P Q R :: bool assume"if P then Q else R" thenhave"Q | R"by argo next fix P Q :: bool assume"P | Q" and"P | ~Q" and"~P | Q" and"~P | ~Q" thenhave"False"by argo next fix P Q R :: bool assume"P | Q | R" and"P | Q | ~R" and"P | ~Q | R" and"P | ~Q | ~R" and"~P | Q | R" and"~P | Q | ~R" and"~P | ~Q | R" and"~P | ~Q | ~R" thenhave"False"by argo next fix a b c d e f g h i j k l m n p q :: bool assume"(a & b | c & d) & (e & f | g & h) | (i & j | k & l) & (m & n | p & q)" thenhave"(a & b | c & d) & (e & f | g & h) | (i & j | k & l) & (m & n | p & q)"by argo next fix P :: bool have"P=P=P=P=P=P=P=P=P=P"by argo next fix a b c d e f p q x :: bool assume"a | b | c | d" and"e | f | (a & d)" and"~(a | (c & ~c)) | b" and"~(b & (x | ~x)) | c" and"~(d | False) | c" and"~(c | (~p & (p | (q & ~q))))" thenhave"False"by argo next have"(True & True & True) = True"by argo next have"(False | False | False) = False"by argo end
subsection‹Equality, congruence and predicates›
notepad begin fix t :: "'a" have"t = t"by argo next fix t u :: "'a" assume"t = u" thenhave"u = t"by argo next fix s t u :: "'a" assume"s = t"and"t = u" thenhave"s = u"by argo next fix s t u v :: "'a" assume"s = t"and"t = u"and"u = v"and"u = s" thenhave"s = v"by argo next fix s t u v w :: "'a" assume"s = t"and"t = u"and"s = v"and"v = w" thenhave"w = u"by argo next fix s t u a b c :: "'a" assume"s = t"and"t = u"and"a = b"and"b = c" thenhave"s = a --> c = u"by argo next fix a b c d :: "'a" assume"(a = b & b = c) | (a = d & d = c)" thenhave"a = c"by argo next fix a b1 b2 b3 b4 c d :: "'a" assume"(a = b1 & ((b1 = b2 & b2 = b3) | (b1 = b4 & b4 = b3)) & b3 = c) | (a = d & d = c)" thenhave"a = c"by argo next fix a b :: "'a" have"(if True then a else b) = a"by argo next fix a b :: "'a" have"(if False then a else b) = b"by argo next fix a b :: "'a" have"(if ¬True then a else b) = b"by argo next fix a b :: "'a" have"(if ¬False then a else b) = a"by argo next fix P :: "bool" fix a :: "'a" have"(if P then a else a) = a"by argo next fix P :: "bool" fix a b c :: "'a" assume"P"and"a = c" thenhave"(if P then a else b) = c"by argo next fix P :: "bool" fix a b c :: "'a" assume"~P"and"b = c" thenhave"(if P then a else b) = c"by argo next fix P Q :: "bool" fix a b c d :: "'a" assume"P"and"Q"and"a = d" thenhave"(if P then (if Q then a else b) else c) = d"by argo next fix a b c :: "'a" assume"a ≠ b"and"b = c" thenhave"a ≠ c"by argo next fix a b c :: "'a" assume"a ≠ b"and"a = c" thenhave"c ≠ b"by argo next fix a b c d :: "'a" assume"a = b"and"c = d"and"b ≠ d" thenhave"a ≠ c"by argo next fix a b c d :: "'a" assume"a = b"and"c = d"and"d ≠ b" thenhave"a ≠ c"by argo next fix a b c d :: "'a" assume"a = b"and"c = d"and"b ≠ d" thenhave"c ≠ a"by argo next fix a b c d :: "'a" assume"a = b"and"c = d"and"d ≠ b" thenhave"c ≠ a"by argo next fix a b c d e f :: "'a" assume"a ≠ b"and"b = c"and"b = d"and"d = e"and"a = f" thenhave"f ≠ e"by argo next fix a b :: "'a"and f :: "'a ==> 'a" assume"a = b" thenhave"f a = f b"by argo next fix a b c :: "'a"and f :: "'a ==> 'a" assume"f a = f b"and"b = c" thenhave"f a = f c"by argo next fix a :: "'a"and f :: "'a ==> 'a" assume"f a = a" thenhave"f (f a) = a"by argo next fix a b :: "'a"and f g :: "'a ==> 'a" assume"a = b" thenhave"g (f a) = g (f b)"by argo next fix a b :: "'a"and f g :: "'a ==> 'a" assume"f a = b"and"g b = a" thenhave"f (g (f a)) = b"by argo next fix a b :: "'a"and g :: "'a ==> 'a ==> 'a" assume"a = b" thenhave"g a b = g b a"by argo next fix a b :: "'a"and f :: "'a ==> 'a"and g :: "'a ==> 'a ==> 'a" assume"f a = b" thenhave"g (f a) b = g b (f a)"by argo next fix a b c d e g h :: "'a"and f :: "'a ==> 'a ==> 'a" assume"c = d"and"e = c"and"e = b"and"b = h"and"f g h = d"and"f g d = a" thenhave"a = b"by argo next fix a b :: "'a"and P :: "'a ==> bool" assume"P a"and"a = b" thenhave"P b"by argo next fix a b :: "'a"and P :: "'a ==> bool" assume"~ P a"and"a = b" thenhave"~ P b"by argo next fix a b c d :: "'a"and P :: "'a ==> 'a ==> bool" assume"P a b"and"a = c"and"b = d" thenhave"P c d"by argo next fix a b c d :: "'a"and P :: "'a ==> 'a ==> bool" assume"~ P a b"and"a = c"and"b = d" thenhave"~ P c d"by argo end
subsection‹Linear real arithmetic›
subsubsection‹Negation and subtraction›
notepad begin fix a b :: real have "-a = -1 * a" "-(-a) = a" "a - b = a + -1 * b" "a - (-b) = a + b" by argo+ end
subsubsection‹Multiplication›
notepad begin fix a b c d :: real have "(2::real) * 3 = 6" "0 * a = 0" "a * 0 = 0" "1 * a = a" "a * 1 = a" "2 * a = a * 2" "2 * a * 3 = 6 * a" "2 * a * 3 * 5 = 30 * a" "2 * (a * (3 * 5)) = 30 * a" "a * 0 * b = 0" "a * (0 * b) = 0" "a * b = b * a" "a * b * a = b * a * a" "a * (b * c) = (a * b) * c" "a * (b * (c * d)) = ((a * b) * c) * d" "a * (b * (c * d)) = ((d * c) * b) * a" "a * (b + c + d) = a * b + a * c + a * d" "(a + b + c) * d = a * d + b * d + c * d" by argo+ end
subsubsection‹Division›
notepad begin fix a b c d :: real have "(6::real) / 2 = 3" "a / 0 = a / 0" "a / 0 <= a / 0" "~(a / 0 < a / 0)" "0 / a = 0" "a / 1 = a" "a / 3 = 1/3 * a" "6 * a / 2 = 3 * a" "(6 * a) / 2 = 3 * a" "a / ((5 * b) / 2) = 2/5 * a / b" "a / (5 * (b / 2)) = 2/5 * a / b" "(a / 5) * (b / 2) = 1/10 * a * b" "a / (3 * b) = 1/3 * a / b" "(a + b) / 5 = 1/5 * a + 1/5 * b" "a / (5 * 1/5) = a" "a * (b / c) = (b * a) / c" "(a / b) * c = (c * a) / b" "(a / b) / (c / d) = (a * d) / (c * b)" "1 / (a * b) = 1 / (b * a)" "a / (3 * b) = 1 / 3 * a / b" "(a + b + c) / d = a / d + b / d + c / d" by argo+ end
subsubsection‹Addition›
notepad begin fix a b c d :: real have "a + b = b + a" "a + b + c = c + b + a" "a + b + c + d = d + c + b + a" "a + (b + (c + d)) = ((a + b) + c) + d" "(5::real) + -3 = 2" "(3::real) + 5 + -1 = 7" "2 + a = a + 2" "a + b + a = b + 2 * a" "-1 + a + -1 + 2 + b + 5/3 + b + 1/3 + 5 * b + 2/3 = 8/3 + a + 7 * b" "1 + b + b + 5 * b + 3 * a + 7 + a + 2 = 10 + 4 * a + 7 * b" by argo+ end
subsubsection‹Minimum and maximum›
notepad begin fix a b :: real have "min (3::real) 5 = 3" "min (5::real) 3 = 3" "min (3::real) (-5) = -5" "min (-5::real) 3 = -5" "min a a = a" "a ≤ b ⟶ min a b = a" "a > b ⟶ min a b = b" "min a b ≤ a" "min a b ≤ b" "min a b = min b a" by argo+ next fix a b :: real have "max (3::real) 5 = 5" "max (5::real) 3 = 5" "max (3::real) (-5) = 3" "max (-5::real) 3 = 3" "max a a = a" "a ≤ b ⟶ max a b = b" "a > b ⟶ max a b = a" "a ≤ max a b" "b ≤ max a b" "max a b = max b a" by argo+ next fix a b :: real have "min a b ≤ max a b" "min a b + max a b = a + b" "a < b ⟶ min a b < max a b" by argo+ end
subsubsection‹Absolute value›
notepad begin fix a :: real have "abs (3::real) = 3" "abs (-3::real) = 3" "0 ≤ abs a" "a ≤ abs a" "a ≥ 0 ⟶ abs a = a" "a < 0 ⟶ abs a = -a" "abs (abs a) = abs a" by argo+ end
subsubsection‹Equality›
notepad begin fix a b c d :: real have "(3::real) = 3" "~((3::real) = 4)" "~((4::real) = 3)" "3 * a = 5 --> a = 5/3" "-3 * a = 5 --> -5/3 = a" "5 = 3 * a --> 5/3 = a " "5 = -3 * a --> a = -5/3" "2 + 3 * a = 4 --> a = 2/3" "4 = 2 + 3 * a --> 2/3 = a" "2 + 3 * a + 5 * b + c = 4 --> 3 * a + 5 * b + c = 2" "4 = 2 + 3 * a + 5 * b + c --> 2 = 3 * a + 5 * b + c" "-2 * a + b + -3 * c = 7 --> -7 = 2 * a + -1 * b + 3 * c" "7 = -2 * a + b + -3 * c --> 2 * a + -1 * b + 3 * c = -7" "-2 * a + b + -3 * c + 4 * d = 7 --> -7 = 2 * a + -1 * b + 3 * c + -4 * d" "7 = -2 * a + b + -3 * c + 4 * d --> 2 * a + -1 * b + 3 * c + -4 * d = -7" "a + 3 * b = 5 * c + b --> a + 2 * b + -5 * c = 0" by argo+ end
subsubsection‹Less-equal›
notepad begin fix a b c d :: real have "(3::real) <= 3" "(3::real) <= 4" "~((4::real) <= 3)" "3 * a <= 5 --> a <= 5/3" "-3 * a <= 5 --> -5/3 <= a" "5 <= 3 * a --> 5/3 <= a " "5 <= -3 * a --> a <= -5/3" "2 + 3 * a <= 4 --> a <= 2/3" "4 <= 2 + 3 * a --> 2/3 <= a" "2 + 3 * a + 5 * b + c <= 4 --> 3 * a + 5 * b + c <= 2" "4 <= 2 + 3 * a + 5 * b + c --> 2 <= 3 * a + 5 * b + c" "-2 * a + b + -3 * c <= 7 --> -7 <= 2 * a + -1 * b + 3 * c" "7 <= -2 * a + b + -3 * c --> 2 * a + -1 * b + 3 * c <= -7" "-2 * a + b + -3 * c + 4 * d <= 7 --> -7 <= 2 * a + -1 * b + 3 * c + -4 * d" "7 <= -2 * a + b + -3 * c + 4 * d --> 2 * a + -1 * b + 3 * c + -4 * d <= -7" "a + 3 * b <= 5 * c + b --> a + 2 * b + -5 * c <= 0" by argo+ end
subsubsection‹Less›
notepad begin fix a b c d :: real have "(3::real) < 4" "~((3::real) < 3)" "~((4::real) < 3)" "3 * a < 5 --> a < 5/3" "-3 * a < 5 --> -5/3 < a" "5 < 3 * a --> 5/3 < a " "5 < -3 * a --> a < -5/3" "2 + 3 * a < 4 --> a < 2/3" "4 < 2 + 3 * a --> 2/3 < a" "2 + 3 * a + 5 * b + c < 4 --> 3 * a + 5 * b + c < 2" "4 < 2 + 3 * a + 5 * b + c --> 2 < 3 * a + 5 * b + c" "-2 * a + b + -3 * c < 7 --> -7 < 2 * a + -1 * b + 3 * c" "7 < -2 * a + b + -3 * c --> 2 * a + -1 * b + 3 * c < -7" "-2 * a + b + -3 * c + 4 * d < 7 --> -7 < 2 * a + -1 * b + 3 * c + -4 * d" "7 < -2 * a + b + -3 * c + 4 * d --> 2 * a + -1 * b + 3 * c + -4 * d < -7" "a + 3 * b < 5 * c + b --> a + 2 * b + -5 * c < 0" by argo+ end
subsubsection‹Other examples›
notepad begin fix a b :: real fix f :: "real ==> 'a" have"f (a + b) = f (b + a)"by argo next have "(0::real) < 1" "(47::real) + 11 < 8 * 15" by argo+ next fix a :: real assume"a < 3" thenhave"a < 5""a <= 5""~(5 < a)""~(5 <= a)"by argo+ next fix a :: real assume"a <= 3" thenhave"a < 5""a <= 5""~(5 < a)""~(5 <= a)"by argo+ next fix a :: real assume"~(3 < a)" thenhave"a < 5""a <= 5""~(5 < a)""~(5 <= a)"by argo+ next fix a :: real assume"~(3 <= a)" thenhave"a < 5""a <= 5""~(5 < a)""~(5 <= a)"by argo+ next fix a :: real have"a < 3 | a = 3 | a > 3"by argo next fix a b :: real assume"0 < a"and"a < b" thenhave"0 < b"by argo next fix a b :: real assume"0 < a"and"a ≤ b" thenhave"0 ≤ b"by argo next fix a b :: real assume"0 ≤ a"and"a < b" thenhave"0 ≤ b"by argo next fix a b :: real assume"0 ≤ a"and"a ≤ b" thenhave"0 ≤ b"by argo next fix a b c :: real assume"2 ≤ a"and"3 ≤ b"and"c ≤ 5" thenhave"-2 * a + -3 * b + 5 * c < 13"by argo next fix a b c :: real assume"2 ≤ a"and"3 ≤ b"and"c ≤ 5" thenhave"-2 * a + -3 * b + 5 * c ≤ 12"by argo next fix a b :: real assume"a = 2"and"b = 3" thenhave"a + b > 5 ∨ a < b"by argo next fix a b c :: real assume"5 < b + c"and"a + c < 0"and"a > 0" thenhave"b > 0"by argo next fix a b c :: real assume"a + b < 7"and"5 < b + c"and"a + c < 0"and"a > 0" thenhave"0 < b ∧ b < 7"by argo next fix a b c :: real assume"a < b"and"b < c"and"c < a" thenhave"False"by argo next fix a b :: real assume"a - 5 > b" thenhave"b < a"by argo next fix a b :: real have"(a - b) - a = (a - a) - b"by argo next fix n m n' m' :: real have" (n < m & m < n') | (n < m & m = n') | (n < n' & n' < m) | (n = n' & n' < m) | (n = m & m < n') | (n' < m & m < n) | (n' < m & m = n) | (n' < n & n < m) | (n' = n & n < m) | (n' = m & m < n) | (m < n & n < n') | (m < n & n' = n) | (m < n' & n' < n) | (m = n & n < n') | (m = n' & n' < n) | (n' = m & m = n)" by argo end
subsection‹Larger examples›
declare[[argo_trace = basic, argo_timeout = 120]]
text‹Translated from TPTP problem library: PUZ015-2.006.dimacs›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.