<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.event-b.org/index.php?action=history&amp;feed=atom&amp;title=Versioned_Reasoners</id>
	<title>Versioned Reasoners - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.event-b.org/index.php?action=history&amp;feed=atom&amp;title=Versioned_Reasoners"/>
	<link rel="alternate" type="text/html" href="https://wiki.event-b.org/index.php?title=Versioned_Reasoners&amp;action=history"/>
	<updated>2026-05-12T08:06:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.event-b.org/index.php?title=Versioned_Reasoners&amp;diff=10632&amp;oldid=prev</id>
		<title>imported&gt;Pascal: /* Category */</title>
		<link rel="alternate" type="text/html" href="https://wiki.event-b.org/index.php?title=Versioned_Reasoners&amp;diff=10632&amp;oldid=prev"/>
		<updated>2009-11-20T17:01:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Category&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:01, 20 November 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l50&quot;&gt;Line 50:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 50:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category: Developer documentation]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;Pascal</name></author>
	</entry>
	<entry>
		<id>https://wiki.event-b.org/index.php?title=Versioned_Reasoners&amp;diff=10631&amp;oldid=prev</id>
		<title>imported&gt;Nicolas: New page: A reasoner implementation is not necessarily frozen code. It may evolve in time, to fix bugs or modify the behaviour (new antecedent, a different WD predicate, ...), even after the old imp...</title>
		<link rel="alternate" type="text/html" href="https://wiki.event-b.org/index.php?title=Versioned_Reasoners&amp;diff=10631&amp;oldid=prev"/>
		<updated>2009-10-06T17:55:41Z</updated>

		<summary type="html">&lt;p&gt;New page: A reasoner implementation is not necessarily frozen code. It may evolve in time, to fix bugs or modify the behaviour (new antecedent, a different WD predicate, ...), even after the old imp...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;A reasoner implementation is not necessarily frozen code. It may evolve in time, to fix bugs or modify the behaviour (new antecedent, a different WD predicate, ...), even after the old implementation was used to prove models. This entails potential problems: what happens if we try to reuse/replay a proof rule serialized by the old reasoner implementation ? There might be unexpected failures, or even worse: silent false successes. Thus, we have to be aware of reasoner implementation changes. This is achieved through a reasoner versioning mechanism.&lt;br /&gt;
&lt;br /&gt;
== A new published interface ==&lt;br /&gt;
&lt;br /&gt;
The {{class|IVersionedReasoner}} interface extends the existing {{class|IReasoner}} interface and provides a method to get the reasoner version ({{method|getVersion()}}), which is defined as a non-negative integer.&lt;br /&gt;
&lt;br /&gt;
To maintain backward compatibility with existing, potentially externally contributed, reasoners, it is not possible to impose the new interface to all reasoners. There will then exist versioned and non-versioned reasoners, all working together.&lt;br /&gt;
&lt;br /&gt;
== Version serialization ==&lt;br /&gt;
&lt;br /&gt;
To be efficient, the version must also be stored in proof rules, so that it can be checked when trying to reuse them. Rather than adding yet another xml attribute into proof files, it has been decided to concatenate the version to the reasoner name, using the following syntax:&lt;br /&gt;
&lt;br /&gt;
 reasonerName:version&lt;br /&gt;
&lt;br /&gt;
When reusing a proof, version conflicts between serialized version and currently registered reasoner version are detected and processed, by trying to apply the latest one.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following is an example implementation of the new {{class|IVersionedReasoner}} interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Example implements IVersionedReasoner {&lt;br /&gt;
	&lt;br /&gt;
	private static final String REASONER_ID = PLUGIN_ID + &amp;quot;.example&amp;quot;;&lt;br /&gt;
	private static final int VERSION = 15;&lt;br /&gt;
	&lt;br /&gt;
	public void serializeInput(IReasonerInput input, IReasonerInputWriter writer)&lt;br /&gt;
			throws SerializeException {&lt;br /&gt;
		// as usual&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public IReasonerInput deserializeInput(IReasonerInputReader reader)&lt;br /&gt;
			throws SerializeException {&lt;br /&gt;
		// as usual&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public IReasonerOutput apply(IProverSequent seq, IReasonerInput input,&lt;br /&gt;
			IProofMonitor pm) {&lt;br /&gt;
		// as usual&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public String getReasonerID() {&lt;br /&gt;
		return REASONER_ID;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getVersion() {&lt;br /&gt;
		return VERSION;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Nicolas</name></author>
	</entry>
</feed>