• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
      • Break-rewrite
      • Proof-builder
      • Accumulated-persistence
      • Cgen
      • Forward-chaining-reports
      • Proof-tree
      • Print-gv
      • Dmr
      • With-brr-data
      • Splitter
      • Guard-debug
      • Set-debugger-enable
      • Redo-flat
      • Time-tracker
      • Set-check-invariant-risk
      • Removable-runes
      • Efficiency
      • Explain-near-miss
      • Tail-biting
      • Failed-forcing
      • Sneaky
      • Invariant-risk
      • Failure
      • Measure-debug
      • Dead-events
      • Compare-objects
      • Prettygoals
      • Remove-hyps
      • Type-prescription-debugging
      • Pstack
      • Trace
      • Set-register-invariant-risk
      • Walkabout
      • Disassemble$
      • Nil-goal
        • Cw-gstack
        • Set-guard-msg
        • Find-lemmas
        • Watch
        • Quick-and-dirty-subsumption-replacement-step
        • Profile-all
        • Profile-ACL2
        • Set-print-gv-defaults
        • Minimal-runes
        • Spacewalk
        • Try-gl-concls
        • Near-misses
      • Std
      • Proof-automation
      • Macro-libraries
      • ACL2
        • Theories
        • Rule-classes
        • Proof-builder
        • Recursion-and-induction
        • Hons-and-memoization
        • Events
        • Parallelism
        • History
        • Programming
        • Operational-semantics
        • Real
        • Start-here
        • Debugging
          • Break-rewrite
          • Proof-builder
          • Accumulated-persistence
          • Cgen
          • Forward-chaining-reports
          • Proof-tree
          • Print-gv
          • Dmr
          • With-brr-data
          • Splitter
          • Guard-debug
          • Set-debugger-enable
          • Redo-flat
          • Time-tracker
          • Set-check-invariant-risk
          • Removable-runes
          • Efficiency
          • Explain-near-miss
          • Tail-biting
          • Failed-forcing
          • Sneaky
          • Invariant-risk
          • Failure
          • Measure-debug
          • Dead-events
          • Compare-objects
          • Prettygoals
          • Remove-hyps
          • Type-prescription-debugging
          • Pstack
          • Trace
          • Set-register-invariant-risk
          • Walkabout
          • Disassemble$
          • Nil-goal
            • Cw-gstack
            • Set-guard-msg
            • Find-lemmas
            • Watch
            • Quick-and-dirty-subsumption-replacement-step
            • Profile-all
            • Profile-ACL2
            • Set-print-gv-defaults
            • Minimal-runes
            • Spacewalk
            • Try-gl-concls
            • Near-misses
          • Miscellaneous
          • Output-controls
          • Macros
          • Interfacing-tools
        • Interfacing-tools
        • Hardware-verification
        • Software-verification
        • Math
        • Testing-utilities
      • Debugging

      Nil-goal

      How to proceed when the prover generates a goal of NIL

      Failed proofs generally conclude with lists of key checkpoints. (See set-gag-mode or introduction-to-key-checkpoints for an introduction to the notion of ``key checkpoint''.) These lists may sometimes be annotated as follows.

      [NOTE: A goal of NIL was generated.  See :DOC nil-goal.]

      This documentation topic gives some ideas about how to think about the situation described by that message, that is: some goal has reduced to NIL.

      Suppose that you see the above NOTE. If you look at the proof log, you will see a message saying that a goal of NIL has been generated. This may indicate that the original goal is not a theorem, since most of the prover's activity is typically to replace a goal by an equivalent conjunction of its child subgoals. However, if some ancestor of the NIL goal has undergone a process other than simplification or destructor elimination — that is, fertilization (heuristic use of equalities), generalization, or elimination of irrelevance — then it is quite possible that the prover got to the NIL goal by replacing a goal by a stronger (and perhaps false) conjunction of child subgoals.

      Let's dig a bit deeper by considering two cases for production of a NIL subgoal. First consider the case that the subgoal is a key checkpoint at the top level or under a top-level induction — that is, a key checkpoint listed in the proof summary. In that case, the original conjecture is very likely not a theorem. Otherwise, if you are using gag-mode (which is the case by default), then you may need to issue the command :pso (``Print Saved Output'') to see whether the goal was strengthened from one that was originally a theorem; but here is what may be a better idea. Instead, it may be best to focus on the key checkpoints printed in the summary to see if they suggest useful rewrite rules to prove.

      If some NIL subgoal is under a key checkpoint at the top level or under a top-level induction, then as discussed above, the original conjecture is probably not a theorem. Therefore, in that case, ACL2 always prints a NIL subgoal first in a list of checkpoints printed in the summary, so that a NIL subgoal comes quickly to your attention.