<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Formal-Methods on CS Theorems</title><link>https://cs.lozic.me/areas/formal-methods/</link><description>Recent content in Formal-Methods on CS Theorems</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 10 Dec 2027 12:00:00 +0100</lastBuildDate><atom:link href="https://cs.lozic.me/areas/formal-methods/index.xml" rel="self" type="application/rss+xml"/><item><title>Resolution and CDCL</title><link>https://cs.lozic.me/posts/t050-resolution-and-cdcl/</link><pubDate>Fri, 10 Dec 2027 12:00:00 +0100</pubDate><guid>https://cs.lozic.me/posts/t050-resolution-and-cdcl/</guid><description>&lt;h2 id="symptom"&gt;Symptom&lt;/h2&gt;
&lt;p&gt;SAT is NP-complete (T027). It is &lt;em&gt;the&lt;/em&gt; NP-complete problem, the one everything
else reduces to. The textbook conclusion is that you should avoid it.&lt;/p&gt;
&lt;p&gt;Meanwhile: a hardware verification team routinely discharges instances with two
million variables and ten million clauses in under a minute. Package managers
solve dependency resolution with SAT. Every bounded model checker (T049) is a SAT
solver with a front end. The planning community abandoned custom search for
SAT encodings and got faster.&lt;/p&gt;</description></item><item><title>Model Checking, LTL, and Buchi Automata</title><link>https://cs.lozic.me/posts/t049-model-checking-ltl-and-buchi-automata/</link><pubDate>Fri, 26 Nov 2027 12:00:00 +0100</pubDate><guid>https://cs.lozic.me/posts/t049-model-checking-ltl-and-buchi-automata/</guid><description>&lt;h2 id="symptom"&gt;Symptom&lt;/h2&gt;
&lt;p&gt;Your distributed lock service deadlocks once a month. You cannot reproduce it.&lt;/p&gt;
&lt;p&gt;The logs show three nodes in states that, as far as you can reconstruct, should
not co-occur. You add tracing. It does not happen again for six weeks, then
happens twice in a day during a deploy. You write a stress test that runs a
million random interleavings overnight and finds nothing.&lt;/p&gt;</description></item><item><title>Hoare Logic and Weakest Preconditions</title><link>https://cs.lozic.me/posts/t048-hoare-logic-and-weakest-preconditions/</link><pubDate>Fri, 19 Nov 2027 12:00:00 +0100</pubDate><guid>https://cs.lozic.me/posts/t048-hoare-logic-and-weakest-preconditions/</guid><description>&lt;h2 id="symptom"&gt;Symptom&lt;/h2&gt;
&lt;p&gt;You changed a loop. It looks right. The tests pass. You are not confident.&lt;/p&gt;
&lt;p&gt;The reason you are not confident is that the tests check a finite set of inputs
and the loop runs on all of them. You know this. So you stare at the loop and
try to convince yourself by simulating it in your head, which works for three
iterations and then stops working.&lt;/p&gt;</description></item><item><title>Abstract Interpretation and Galois Connections</title><link>https://cs.lozic.me/posts/t047-abstract-interpretation-and-galois-connections/</link><pubDate>Fri, 22 Oct 2027 12:00:00 +0100</pubDate><guid>https://cs.lozic.me/posts/t047-abstract-interpretation-and-galois-connections/</guid><description>&lt;h2 id="symptom"&gt;Symptom&lt;/h2&gt;
&lt;p&gt;Rice&amp;rsquo;s theorem (T011) told you every non-trivial semantic property is
undecidable. Your static analyzer must therefore be unsound, incomplete, or
non-terminating. In practice it is incomplete: it reports things that cannot
happen.&lt;/p&gt;</description></item><item><title>Progress and Preservation</title><link>https://cs.lozic.me/posts/t044-progress-and-preservation/</link><pubDate>Fri, 01 Oct 2027 12:00:00 +0100</pubDate><guid>https://cs.lozic.me/posts/t044-progress-and-preservation/</guid><description>&lt;h2 id="symptom"&gt;Symptom&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Well-typed programs don&amp;rsquo;t go wrong.&amp;rdquo; You have heard it. You have probably said
it. And then:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// NullPointerException&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That program is well typed and it went wrong. So either the slogan is false or
it means something narrower than it sounds. It means something narrower, and the
narrowness is precisely specifiable.&lt;/p&gt;</description></item></channel></rss>