<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=Lean_theorem_prover%2FExplainers%2FFunctions_that_always_finish</id>
	<title>Lean theorem prover/Explainers/Functions that always finish - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=Lean_theorem_prover%2FExplainers%2FFunctions_that_always_finish"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Functions_that_always_finish&amp;action=history"/>
	<updated>2026-10-21T16:00:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Functions_that_always_finish&amp;diff=6759&amp;oldid=prev</id>
		<title>PMA Publisher: Published from the Principia Machina source</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Functions_that_always_finish&amp;diff=6759&amp;oldid=prev"/>
		<updated>2026-10-15T19:34:28Z</updated>

		<summary type="html">&lt;p&gt;Published from the Principia Machina source&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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&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 19:34, 15 October 2026&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-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&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;{{DISPLAYTITLE:Functions that always finish}}&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;{{DISPLAYTITLE:Functions that always finish}}&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;{{Technical|Lean theorem prover/Foundations/Structural and well-founded recursion}}&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;{{Technical|Lean theorem prover/Foundations/Structural and well-founded recursion}}&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;{{Lean theorem prover map}}&lt;/ins&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;br&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;br&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;Every function defined inside Lean&amp;#039;s logic must finish: given any input, it must return an&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;Every function defined inside Lean&amp;#039;s logic must finish: given any input, it must return an&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PMA Publisher</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Functions_that_always_finish&amp;diff=6552&amp;oldid=prev</id>
		<title>PMA Publisher: Published from the Principia Machina source</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Functions_that_always_finish&amp;diff=6552&amp;oldid=prev"/>
		<updated>2026-10-14T18:00:49Z</updated>

		<summary type="html">&lt;p&gt;Published from the Principia Machina source&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Functions that always finish}}&lt;br /&gt;
{{Technical|Lean theorem prover/Foundations/Structural and well-founded recursion}}&lt;br /&gt;
&lt;br /&gt;
Every function defined inside Lean&amp;#039;s logic must finish: given any input, it must return an&lt;br /&gt;
answer after finitely many steps. This page says why that rule exists, how Lean checks it,&lt;br /&gt;
and what becomes of a program that might run for ever.&lt;br /&gt;
&lt;br /&gt;
== Why a loop would be a proof ==&lt;br /&gt;
&lt;br /&gt;
In Lean a definition is more than a recipe for computing. It is also an equation the logic&lt;br /&gt;
may use in proofs. Write a definition that says &amp;quot;the answer for n is the answer for n, plus&lt;br /&gt;
one&amp;quot;, and you have asked the logic to accept that some number equals itself plus one. No&lt;br /&gt;
natural number does. If the equation were admitted, Lean could prove a false statement, and&lt;br /&gt;
from one false statement every statement follows. The whole system would be worthless.&lt;br /&gt;
&lt;br /&gt;
So Lean refuses the definition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean lean-fails&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
def loop (n : Nat) : Nat := loop n + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lean 4.34.1 begins its reply with &amp;lt;code&amp;gt;fail to show termination for&amp;lt;/code&amp;gt;, names&lt;br /&gt;
&amp;lt;code&amp;gt;loop&amp;lt;/code&amp;gt;, and gives its reason: the argument &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; &amp;quot;is unchanged in the&lt;br /&gt;
recursive calls&amp;quot;. Nothing gets smaller, so nothing guarantees an end. The Lean Language&lt;br /&gt;
Reference states the danger directly: unrestricted recursion would make Lean&amp;#039;s logic&lt;br /&gt;
inconsistent, because it would allow a circular proof, one that says a statement holds&lt;br /&gt;
because it holds.&amp;lt;ref name=&amp;quot;ref-rec&amp;quot;&amp;gt;&amp;#039;&amp;#039;The Lean Language Reference&amp;#039;&amp;#039;, version for Lean 4.34.0&lt;br /&gt;
(lean-lang.org, 2026), section 7.6, &amp;quot;Recursive Definitions&amp;quot;, with section 7.6.6.1, &amp;quot;Partial&lt;br /&gt;
Functions&amp;quot;. https://lean-lang.org/doc/reference/4.34.0/Definitions/Recursive-Definitions/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why Lean cannot just watch for loops ==&lt;br /&gt;
&lt;br /&gt;
A natural idea is to let the computer inspect each definition and decide whether it always&lt;br /&gt;
finishes. That cannot be done in general. In 1936 Alan Turing showed that no mechanical&lt;br /&gt;
procedure can settle, for every machine, questions of this kind, such as whether a given&lt;br /&gt;
machine will ever print a certain symbol.&amp;lt;ref name=&amp;quot;turing&amp;quot;&amp;gt;A. M. Turing, &amp;quot;On Computable&lt;br /&gt;
Numbers, with an Application to the Entscheidungsproblem&amp;quot;, &amp;#039;&amp;#039;Proceedings of the London&lt;br /&gt;
Mathematical Society&amp;#039;&amp;#039;, series 2, vol. 42 (1936–37), pp. 230–265.&lt;br /&gt;
doi:10.1112/plms/s2-42.1.230&amp;lt;/ref&amp;gt; The best-known form of the result, the &amp;#039;&amp;#039;&amp;#039;halting&lt;br /&gt;
problem&amp;#039;&amp;#039;&amp;#039;, asks whether a program stops; it too has no general solution.&amp;lt;ref name=&amp;quot;demol&amp;quot;&amp;gt;Liesbeth&lt;br /&gt;
De Mol, &amp;quot;Turing Machines&amp;quot;, &amp;#039;&amp;#039;The Stanford Encyclopedia of Philosophy&amp;#039;&amp;#039; (first published&lt;br /&gt;
2018, substantive revision 21 May 2025), section 2.4.&lt;br /&gt;
https://plato.stanford.edu/entries/turing-machine/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So Lean does not try to decide termination. It asks the author for a reason it can check,&lt;br /&gt;
and it accepts two kinds of reason.&lt;br /&gt;
&lt;br /&gt;
== Reason one: the input gets smaller ==&lt;br /&gt;
&lt;br /&gt;
Many functions call themselves only on a piece of their input. The factorial is the&lt;br /&gt;
standard case:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
def fact : Nat → Nat&lt;br /&gt;
  | 0     =&amp;gt; 1&lt;br /&gt;
  | n + 1 =&amp;gt; (n + 1) * fact n&lt;br /&gt;
&lt;br /&gt;
#eval fact 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lean prints &amp;lt;code&amp;gt;2432902008176640000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A natural number in Lean is zero with some number of &amp;quot;plus ones&amp;quot; stacked on it (see&lt;br /&gt;
[[Lean theorem prover/Explainers/Building things from constructors|building things from&lt;br /&gt;
constructors]]). The second line of the definition handles a number of the form&lt;br /&gt;
&amp;lt;code&amp;gt;n + 1&amp;lt;/code&amp;gt; by calling &amp;lt;code&amp;gt;fact&amp;lt;/code&amp;gt; on &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, which has one layer fewer.&lt;br /&gt;
Every number has finitely many layers, so the calls must reach zero. This is called&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;structural recursion&amp;#039;&amp;#039;&amp;#039;: each call works on a strict part of the input. Lean recognises&lt;br /&gt;
it without help. It translates the definition into the recursion principle that comes with&lt;br /&gt;
the type of natural numbers, and the Lean kernel then needs no separate test for termination,&lt;br /&gt;
only its ordinary check of types.&amp;lt;ref name=&amp;quot;ref-kernel&amp;quot;&amp;gt;&amp;#039;&amp;#039;The Lean Language Reference&amp;#039;&amp;#039;,&lt;br /&gt;
version for Lean 4.34.0 (lean-lang.org, 2026), chapter 2, &amp;quot;Elaboration and Compilation&amp;quot;,&lt;br /&gt;
section 2.3, &amp;quot;The Kernel&amp;quot;.&lt;br /&gt;
https://lean-lang.org/doc/reference/4.34.0/Elaboration-and-Compilation/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reason two: a measure goes down ==&lt;br /&gt;
&lt;br /&gt;
Some functions shrink their input in a way that is not &amp;quot;taking a piece&amp;quot;. This one counts how&lt;br /&gt;
many times a number can be halved before it falls below 2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
def halvings (n : Nat) : Nat :=&lt;br /&gt;
  if n &amp;amp;lt; 2 then 0 else 1 + halvings (n / 2)&lt;br /&gt;
termination_by n&lt;br /&gt;
decreasing_by omega&lt;br /&gt;
&lt;br /&gt;
#eval halvings 1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lean prints &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Half of a number is not one of its layers, so structural recursion does not apply. The line&lt;br /&gt;
&amp;lt;code&amp;gt;termination_by n&amp;lt;/code&amp;gt; names a &amp;#039;&amp;#039;&amp;#039;measure&amp;#039;&amp;#039;&amp;#039;: a quantity, here the number itself, that&lt;br /&gt;
must be smaller at every recursive call. Lean then sets a small proof obligation for each&lt;br /&gt;
call. Here the obligation is &amp;lt;code&amp;gt;n / 2 &amp;amp;lt; n&amp;lt;/code&amp;gt;, to be shown knowing that&lt;br /&gt;
&amp;lt;code&amp;gt;n &amp;amp;lt; 2&amp;lt;/code&amp;gt; is false. The line &amp;lt;code&amp;gt;decreasing_by omega&amp;lt;/code&amp;gt; supplies the proof,&lt;br /&gt;
using an arithmetic procedure described in&lt;br /&gt;
[[Lean theorem prover/Explainers/Automation and its limits|automation and its limits]]. When&lt;br /&gt;
&amp;lt;code&amp;gt;decreasing_by&amp;lt;/code&amp;gt; is left out, Lean tries a default procedure of its own. This is&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;well-founded recursion&amp;#039;&amp;#039;&amp;#039;: there is no endless descending chain of natural numbers, so a&lt;br /&gt;
measure that falls at every step must stop.&amp;lt;ref name=&amp;quot;ref-rec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two kinds differ in cost. A function defined by structural recursion computes readily&lt;br /&gt;
inside the logic. One defined by well-founded recursion often does not, because the checker&lt;br /&gt;
must work through the proof of termination as well; the Lean Language Reference warns that&lt;br /&gt;
such functions are frequently slow to compute with (see&lt;br /&gt;
[[Lean theorem prover/Explainers/Computation inside proofs|computation inside&lt;br /&gt;
proofs]]).&amp;lt;ref name=&amp;quot;ref-rec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programs that may never finish ==&lt;br /&gt;
&lt;br /&gt;
Some programs are useful even though nobody can prove that they stop. Start with a positive&lt;br /&gt;
whole number; halve it if it is even, otherwise triple it and add one; repeat until you&lt;br /&gt;
reach 1. Whether every starting number reaches 1 is the 3x+1 problem, also called the&lt;br /&gt;
Collatz problem, and it is unsolved.&amp;lt;ref name=&amp;quot;lagarias&amp;quot;&amp;gt;Jeffrey C. Lagarias, &amp;quot;The 3x+1&lt;br /&gt;
problem: an annotated bibliography (1963–1999) (sorted by author)&amp;quot;, arXiv:math/0309224&lt;br /&gt;
(2003, revised 2011). https://arxiv.org/abs/math/0309224&amp;lt;/ref&amp;gt; A function that counts the&lt;br /&gt;
steps can be written, but no proof that it always finishes is known. Lean accepts it when it&lt;br /&gt;
is marked &amp;lt;code&amp;gt;partial&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
partial def collatz (n : Nat) : Nat :=&lt;br /&gt;
  if n ≤ 1 then 0&lt;br /&gt;
  else if n % 2 == 0 then 1 + collatz (n / 2)&lt;br /&gt;
  else 1 + collatz (3 * n + 1)&lt;br /&gt;
&lt;br /&gt;
#eval collatz 27&lt;br /&gt;
#print collatz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The program runs: &amp;lt;code&amp;gt;#eval&amp;lt;/code&amp;gt; prints &amp;lt;code&amp;gt;111&amp;lt;/code&amp;gt;. But &amp;lt;code&amp;gt;#print&amp;lt;/code&amp;gt; shows&lt;br /&gt;
what the logic sees: &amp;lt;code&amp;gt;opaque collatz : Nat → Nat&amp;lt;/code&amp;gt;. To the logic, a partial&lt;br /&gt;
function is a sealed box with the right type and nothing inside. Lean checks that the body&lt;br /&gt;
is well typed, compiles it so that it can run, and then keeps only the sealed box for&lt;br /&gt;
reasoning.&amp;lt;ref name=&amp;quot;ref-rec&amp;quot; /&amp;gt; Even the obvious fact that the count for 1 is 0 cannot be&lt;br /&gt;
proved by opening the box:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean lean-cont lean-fails&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
example : collatz 1 = 0 := by rfl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lean replies &amp;lt;code&amp;gt;Tactic `rfl` failed: The left-hand side&amp;lt;/code&amp;gt;, then says that&lt;br /&gt;
&amp;lt;code&amp;gt;collatz 1&amp;lt;/code&amp;gt; &amp;quot;is not definitionally equal to the right-hand side&amp;quot; &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
One condition remains. The result type of a partial function must have at least one value.&lt;br /&gt;
Otherwise a partial function promising a value of an empty type could be used to prove a&lt;br /&gt;
falsehood, even though it never returns anything.&amp;lt;ref name=&amp;quot;ref-rec&amp;quot; /&amp;gt; A definition marked&lt;br /&gt;
&amp;lt;code&amp;gt;unsafe&amp;lt;/code&amp;gt; drops even that safeguard, and in return no theorem may refer to&lt;br /&gt;
it.&amp;lt;ref name=&amp;quot;ref-rec&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What the rule buys ==&lt;br /&gt;
&lt;br /&gt;
Because of this rule, every function whose definition the logic can use is total: it has an&lt;br /&gt;
answer for every input, and the logic may reason about that answer. The price is that the&lt;br /&gt;
author must sometimes say why a function stops. That reason is checked like any other proof.&lt;br /&gt;
A program that cannot be given one can still be written and run, as &amp;lt;code&amp;gt;partial&amp;lt;/code&amp;gt;,&lt;br /&gt;
but in proofs it stays a sealed box.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
&lt;br /&gt;
* [[Lean theorem prover/Explainers/Building things from constructors|Building things from constructors]]: the layered values that structural recursion takes apart.&lt;br /&gt;
* [[Lean theorem prover/Foundations/Structural and well-founded recursion|Structural and well-founded recursion]]: the technical treatment of both kinds of reason.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>PMA Publisher</name></author>
	</entry>
</feed>