Testing 运行和测试表示TAKE和APPEND之间关系的属性

Testing 运行和测试表示TAKE和APPEND之间关系的属性,testing,lisp,proof,acl2,Testing,Lisp,Proof,Acl2,基本上,我需要写一个标题所说的,我能想到的唯一关系是,如果我用take从一个列表中取一些元素,然后用CDR取不那么重要的另一半,然后用APPEND这两个元素来证明它与原始列表相同。 (经过长时间痛苦的构建之后),证明似乎很好(它编译得很好),但由于某种原因,它在运行时失败了。 我正在使用德古拉的校对板,以防你需要信息 代码如下: (include-book "doublecheck" :dir :teachpacks) (defproperty take-append-relationship

基本上,我需要写一个标题所说的,我能想到的唯一关系是,如果我用
take
从一个列表中取一些元素,然后用
CDR
取不那么重要的另一半,然后用
APPEND
这两个元素来证明它与原始列表相同。 (经过长时间痛苦的构建之后),证明似乎很好(它编译得很好),但由于某种原因,它在运行时失败了。 我正在使用德古拉的校对板,以防你需要信息

代码如下:

(include-book "doublecheck" :dir :teachpacks)

(defproperty take-append-relationship-test ;not sure why this fails.
   (xs :value (random-integer-list))
   (iff (consp xs)
        (let* ((x1 (take 1 xs))
               (xs2 (cdr xs)))
            (equal (append x1 xs2)
                   xs))))
这是我得到的错误日志

By the simple :definition TAKE we reduce the conjecture to

Goal'
(COND ((CONSP XS)
       (LET ((X1 (FIRST-N-AC 1 XS NIL)))
            (EQUAL (APPEND X1 (CDR XS)) XS)))
      ((LET ((X1 (FIRST-N-AC 1 XS NIL)))
            (EQUAL (APPEND X1 (CDR XS)) XS))
       NIL)
      (T T)).

This simplifies, using the :definition FIRST-N-AC, the :executable-
counterparts of BINARY-+, BINARY-APPEND, CONS, FIRST-N-AC and ZP, primitive
type reasoning and the :rewrite rules DEFAULT-CAR and DEFAULT-CDR,
to

Goal''
(IMPLIES (CONSP XS)
         (EQUAL (APPEND (FIRST-N-AC 1 XS NIL) (CDR XS))
                XS)).

The destructor terms (CAR XS) and (CDR XS) can be eliminated by using
CAR-CDR-ELIM to replace XS by (CONS XS1 XS2), (CAR XS) by XS1 and (CDR XS)
by XS2.  This produces the following goal.

Goal'''
(IMPLIES (CONSP (CONS XS1 XS2))
         (EQUAL (APPEND (FIRST-N-AC 1 (CONS XS1 XS2) NIL)
                        XS2)
                (CONS XS1 XS2))).

This simplifies, using primitive type reasoning, to

Goal'4'
(EQUAL (APPEND (FIRST-N-AC 1 (CONS XS1 XS2) NIL)
               XS2)
       (CONS XS1 XS2)).

Normally we would attempt to prove Goal'4' by induction.  However,
we prefer in this instance to focus on the original input conjecture
rather than this simplified special case.  We therefore abandon our
previous work on this conjecture and reassign the name *1 to the original
conjecture.  (See :DOC otf-flg.)

No induction schemes are suggested by *1.  Consequently, the proof
attempt has failed.

Summary
Form:  ( DEFTHM TAKE-APPEND-RELATIONSHIP-TEST ...)
Rules: ((:DEFINITION FIRST-N-AC)
        (:DEFINITION IFF)
        (:DEFINITION TAKE)
        (:ELIM CAR-CDR-ELIM)
        (:EXECUTABLE-COUNTERPART BINARY-+)
        (:EXECUTABLE-COUNTERPART BINARY-APPEND)
        (:EXECUTABLE-COUNTERPART CONS)
        (:EXECUTABLE-COUNTERPART FIRST-N-AC)
        (:EXECUTABLE-COUNTERPART ZP)
        (:FAKE-RUNE-FOR-TYPE-SET NIL)
        (:REWRITE DEFAULT-CAR)
        (:REWRITE DEFAULT-CDR))
Time:  0.00 seconds (prove: 0.00, print: 0.00, other: 0.00)
Prover steps counted:  328

---
The key checkpoint goal, below, may help you to debug this failure.
See :DOC failure and see :DOC set-checkpoint-summary-limit.
---

*** Key checkpoint before reverting to proof by induction: ***

Goal''
(IMPLIES (CONSP XS)
         (EQUAL (APPEND (FIRST-N-AC 1 XS NIL) (CDR XS))
                XS))

ACL2 Error in ( DEFTHM TAKE-APPEND-RELATIONSHIP-TEST ...):  See :DOC
failure.

******** FAILED ********
至少有人能给我指出正确的方向吗? 我已经阅读了错误日志,我得到的是存在某种冗余。 我根本不知道如何解决这个问题


如果我这样做(像
”(1 2 3 4)
而不是
(随机整数列表)
),它会抛出一个错误:

ACL2 Error in TOP-LEVEL:  One value, '(1 2 3 4 5), is being returned
where 2 values were expected.  Note:  This error occurred in the context
(MV-LET (XS STATE)
        '(1 2 3 4 5)
        (IF T
            (MV-LET (STATE RESULT ASSIGNMENTS)
                    (EXPAND-VARS NIL (IFF # #))
                    (MV STATE RESULT (CONS # ASSIGNMENTS)))
            (MV STATE 'WHERE-NOT-MATCHED NIL))).
(See :DOC set-iprint to be able to see elided values in this message.)

我的设置:

  • 安装球拍
  • 打开它并运行以下代码:

    (磅)朗球拍 (需要(行星cce/dracula:8:23/lang/dracula))

  • 重新启动Racket博士。单击窗口底部的“选择语言”,然后在Dracula下选择ACL2

  • 从Dracula菜单中,选择“更改ACL2可执行路径…”并选择位于proofpad安装文件夹中的“run_ACL2”(或“run_ACL2.exe”)(即“C:\Program Files(x86)\proofpad”,如果您有64位PC)

  • 。确保将其解压缩到Proofpad安装目录中,否则它会告诉您它没有找到所需的东西


  • 我没有使用你正在使用的证明系统,但我想知道你试图证明的定理是否真的成立。没有使用过ACL,我不知道
    TAKE
    的定义是什么,这里也不包括它。当
    xs
    是空列表(我希望它只是一个整数列表)时会发生什么?如果
    (取1'())
    ()
    ,而
    (cdr'())
    ()
    ,那么
    (追加(取1'())(cdr'())
    ”()
    ,但是
    (consp'())
    是错误的。您能否详细说明错误日志如何向您建议冗余?我注意到,“因此,我们放弃了之前关于这个猜想的工作,并将名称*1重新指定给原始猜想。(参见:DOC otf flg。)*1没有提出任何归纳方案。因此,证明尝试失败。”听起来你得到了一个表格,系统正试图应用归纳方案,但是没有找到任何适用的。@JoshuaTaylor是的,对不起,我把自己和以前的错误搞混了。是的,我理解不能应用归纳法,但是我不知道如何解决它。这里是So(take 1’())的定义,实际上是(nil),我想是从PSP++那里得到的。我认为这会有所帮助。我找到了(用于随机测试的Dracula教学包),但这似乎是针对Scheme环境,而不是基于公共Lisp构建的ACL2环境,所以我不确定如何继续。在不同的路径上,如果您尝试在固定输入而不是
    (随机整数列表)
    上运行此证明,会发生什么?