Dưới đây là định nghĩa của tôi quy nạp của palindromes:Chứng minh rằng một danh sách đảo ngược là một palindrome trong Coq
Inductive pal { X : Type } : list X -> Prop :=
| pal0 : pal []
| pal1 : forall (x : X), pal [x]
| pal2 : forall (x : X) (l : list X), pal l -> pal (x :: l ++ [x]).
Và định lý tôi muốn chứng minh, từ Foundations Software:
Theorem rev_eq_pal : forall (X : Type) (l : list X),
l = rev l -> pal l.
My các phác thảo chính thức của bằng chứng như sau:
Giả sử
l0
là một danh sách tùy ý như vậyl0 = rev l0
. Sau đó, một trong ba trường hợp sau phải giữ.l0
có:(a) phần tử không, trong trường hợp đó là palindrome theo định nghĩa.
(b) một phần tử, trong trường hợp đó, nó cũng là palindrome theo định nghĩa.
(c) hai thành phần trở lên, trong trường hợp này là
l0 = x :: l1 ++ [x]
đối với một số thành phầnx
và một số danh sáchl1
sao chol1 = rev l1
.Bây giờ, kể từ khi
l1 = rev l1
, một trong ba trường hợp sau đây phải giữ ...Phân tích trường hợp đệ quy sẽ chấm dứt đối với bất kỳ danh sách hữu hạn
l0
vì độ dài của danh sách đã phân tích giảm bởi 2 thông qua mỗi lần lặp. Nếu nó kết thúc cho bất kỳ danh sáchln
, tất cả các danh sách bên ngoài của nó lên đếnl0
cũng là palindromes, vì danh sách được xây dựng bằng cách chắp thêm hai phần tử giống nhau ở cuối đầu palindrome cũng là palindrome.
Tôi nghĩ lý do là âm thanh, nhưng tôi không chắc chắn làm thế nào để chính thức hóa nó. Liệu nó có thể trở thành một bằng chứng trong Coq? Một số giải thích về cách chiến thuật sử dụng công việc sẽ đặc biệt hữu ích.