From 850ff7e6287407b2328fc1f5d54bc6d80828d645 Mon Sep 17 00:00:00 2001
From: Florian Cassayre <florian.cassayre@gmail.com>
Date: Tue, 1 Mar 2022 11:42:16 +0100
Subject: [PATCH] Fix the indenting of imports in the printer

---
 src/main/scala/lisa/kernel/Printer.scala | 31 ++++++++++++++++--------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/src/main/scala/lisa/kernel/Printer.scala b/src/main/scala/lisa/kernel/Printer.scala
index cd8c20e2..9123f72b 100644
--- a/src/main/scala/lisa/kernel/Printer.scala
+++ b/src/main/scala/lisa/kernel/Printer.scala
@@ -180,6 +180,17 @@ object Printer {
         Seq(prettyFormulas(sequent.left), "⊢", prettyFormulas(sequent.right)).filter(_.nonEmpty).mkString(spaceSeparator(compact))
     }
 
+    /**
+     * Returns a string representation of the line number in a proof.
+     * Example output:
+     * <pre>
+     * 0:2:1
+     * </pre>
+     * @param line the line number
+     * @return the string representation of this line number
+     */
+    def prettyLineNumber(line: Seq[Int]): String = line.mkString(":")
+
     /**
      * Returns a string representation of this proof.
      * @param proof the proof
@@ -187,14 +198,13 @@ object Printer {
      *                  (`->`) as an error. The proof is considered to be valid by default
      * @return a string where each indented line corresponds to a step in the proof
      */
-    def prettySCProof(proof: SCProof, judgement: SCProofCheckerJudgement = SCValidProof): String = {
-        def computeMaxNumbering(proof: SCProof, level: Int, result: IndexedSeq[Int]): IndexedSeq[Int] = {
-            val resultWithCurrent = result.updated(level, Math.max(proof.steps.size - 1, result(level)))
-            proof.steps.collect { case sp: SCSubproof => sp }.foldLeft(resultWithCurrent)((acc, sp) => computeMaxNumbering(sp.sp, level + 1, if(acc.size <= level + 1) acc :+ 0 else acc))
+    def prettySCProof(proof: SCProof, judgement: SCProofCheckerJudgement = SCValidProof, forceDisplaySubproofs: Boolean = false): String = {
+        def computeMaxNumberingLengths(proof: SCProof, level: Int, result: IndexedSeq[Int]): IndexedSeq[Int] = {
+          val resultWithCurrent = result.updated(level, (Seq((proof.steps.size - 1).toString.length, result(level)) ++ (if(proof.imports.nonEmpty) Seq((-proof.imports.size).toString.length) else Seq.empty)).max)
+          proof.steps.collect { case sp: SCSubproof => sp }.foldLeft(resultWithCurrent)((acc, sp) => computeMaxNumberingLengths(sp.sp, level + 1, if(acc.size <= level + 1) acc :+ 0 else acc))
         }
-        val maxNumbering = computeMaxNumbering(proof, 0, IndexedSeq(0)) // The maximum value for each number column
-        val maxNumberingLengths = maxNumbering.map(_.toString.length)
-        val maxLevel = maxNumbering.size - 1
+        val maxNumberingLengths = computeMaxNumberingLengths(proof, 0, IndexedSeq(0)) // The maximum value for each number column
+        val maxLevel = maxNumberingLengths.size - 1
 
         def leftPadSpaces(v: Any, n: Int): String = {
             val s = String.valueOf(v)
@@ -239,7 +249,8 @@ object Printer {
                         prettySequent(step.bot)
                     )
                 step match {
-                    case sp @ SCSubproof(_, _, true) => pretty("Subproof", sp.premises*) +: prettySCProofRecursive(sp.sp, level + 1, currentTree, (if(i == 0) topMostIndices else IndexedSeq.empty) :+ i)
+                    case sp @ SCSubproof(_, _, display) if display || forceDisplaySubproofs =>
+                        pretty("Subproof", sp.premises*) +: prettySCProofRecursive(sp.sp, level + 1, currentTree, (if(i == 0) topMostIndices else IndexedSeq.empty) :+ i)
                     case other =>
                         val line = other match {
                             case Rewrite(_, t1) => pretty("Rewrite", t1)
@@ -268,7 +279,7 @@ object Printer {
                             case RightSubstIff(_, t1, _, _, _, _) => pretty("R. SubstIff", t1)
                             case InstFunSchema(_, t1, _, _, _) => pretty("?Fun Instantiation", t1)
                             case InstPredSchema(_, t1, _, _, _) => pretty("?Pred Instantiation", t1)
-                            case SCSubproof(_, _, false) => pretty("SCSubproof (hidden)")
+                            case SCSubproof(_, _, false) => pretty("Subproof (hidden)")
                             case other => throw new Exception(s"No available method to print this proof step, consider updating Printer.scala\n$other")
                         }
                         Seq(line)
@@ -288,7 +299,7 @@ object Printer {
                 full.mkString(" ")
         }.mkString("\n") + (judgement match {
             case SCValidProof => ""
-            case SCInvalidProof(path, message) => s"\nProof checker has reported error at line ${path.mkString(".")}: $message"
+            case SCInvalidProof(path, message) => s"\nProof checker has reported an error at line ${path.mkString(".")}: $message"
         })
     }
 
-- 
GitLab