A generic insert sort based on ACL2's total order of values.
(insertion-sort list) → sorted-list
This should be moved to a more general library.
Function:
(defun insertion-sort-insert (elem list) (declare (xargs :guard (true-listp list))) (let ((__function__ 'insertion-sort-insert)) (declare (ignorable __function__)) (cond ((endp list) (list elem)) ((<< elem (car list)) (cons elem list)) (t (cons (car list) (insertion-sort-insert elem (cdr list)))))))
Theorem:
(defthm true-listp-of-insertion-sort-insert (implies (and (true-listp list)) (b* ((list-with-elem (insertion-sort-insert elem list))) (true-listp list-with-elem))) :rule-classes (:rewrite :type-prescription))
Function:
(defun insertion-sort (list) (declare (xargs :guard (true-listp list))) (let ((__function__ 'insertion-sort)) (declare (ignorable __function__)) (cond ((endp list) nil) (t (insertion-sort-insert (car list) (insertion-sort (cdr list)))))))
Theorem:
(defthm true-listp-of-insertion-sort (implies (and (true-listp list)) (b* ((sorted-list (insertion-sort list))) (true-listp sorted-list))) :rule-classes (:rewrite :type-prescription))