证明在acl2中给出最少列表的函数

时间:2017-10-16 16:18:36

标签: acl2

我需要尝试显示一个找到列表最小值的函数,但是我觉得我已经接近了它但实际上并没有得到它。

教练给我们这个功能:

(defun minlist (l)
  (if (<= (len l) 1)
    (first l)
    (if (<= (first l) (minlist (rest l)))
      (first l)
      (minlist (rest l)))))

然后说

;;; TODO: Write a little theory that verifies that the minlist of a list is 
;;; less than or equal to any element of the list
;;; Hint: Use this declaration to generate a non-empty list
;;;  (n :value (random-between 1 10)
;;;   l :value (random-natural-list-of-length n))    

然后我做了:

(defproperty-program minlist-<=-member (n)
    (if ((n :value (random-between 1 10) 
          l :value (random-natural-list-of-length n)))
          (<= (min-list l) (first l))
          (nil)))

哪个在Proof Pad中给我一个错误,我无法弄清楚我做错了什么。

错误是:

HARD ACL2 ERROR:缺少:N

的值参数

TOP-LEVEL中的ACL2错误:尝试宏扩展表单

(EXPAND-VARS (N)
             (IF ((N :VALUE (RANDOM-BETWEEN 1 10)
                     L
                     :VALUE (RANDOM-NATURAL-LIST-OF-LENGTH N)))
                 (<= (MIN-LIST L) (FIRST L))
                 (NIL))),

宏体评估导致以下错误:

评估中止。要调试,请参阅:DOC print-gv,请参阅:DOC跟踪和 见:DOC湿了。

1 个答案:

答案 0 :(得分:1)

很抱歉,如果这篇帖子来不及。

因此,我发现一些有关“不称职”的“结构”问题,其中之一是调用min-list (<= (MIN-LIST L),但有关minlist的函数是没有破折号的minlist。另外,该部分 (n :value (random-between 1 10) l :value (random-natural-list-of-length n))

构造要使用的列表,并且根本不应该在if语句中。它应该在它上面。另外,该语句声明了n值,并且您不需要(n)。完成这些更改后,您最终会得到

   (defproperty-program minlist-<=-member
(n :value (random-between 1 10) 
          l :value (random-natural-list-of-length n))
    (if (<= (minlist l) (first l))
          (nil)))

但是,这会使您的if语句缺少足够的参数。还有,你的陈述 '(<=(minlist l)(头l))' 仅检查列表的第一个元素是否小于或等于minlist元素。这并不表明它小于可能存在的其他元素。

我希望这会有所帮助。