Làm cách nào để xác định hàm theo quy nạp trên hai đối số trong Coq?


14

Làm thế nào tôi có thể thuyết phục Coq rằng hàm đệ quy được đưa ra dưới đây chấm dứt? Hàm này có hai đối số quy nạp. Theo trực giác, đệ quy chấm dứt vì một trong hai đối số bị phân rã.

Cụ thể, hàm lấy hai cây làm đầu vào.

Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.

Trên cây, tôi thích làm theo kiểu cảm ứng sau đây.

Inductive TreePair :=
| TipTip : TreePair
| TipBin : Tree -> Tree -> TreePair
| BinTip : Tree -> Tree -> TreePair
| BinBin : TreePair -> TreePair -> TreePair.

Fixpoint pair (l r: Tree): TreePair :=
  match l with
    | Tip =>
      match r with
        | Tip => TipTip
        | Bin rl rr => TipBin rl rr
      end
    | Bin ll lr =>
      match r with
        | Tip => BinTip ll lr
        | Bin rl rr => BinBin (pair l rl) (pair lr r)
      end
  end.

Định nghĩa của TreePair được chấp nhận, nhưng định nghĩa của cặp hàm mang lại thông báo lỗi:

Error: Cannot guess decreasing argument of fix.

Vì vậy, tôi quan tâm đến cách thuyết phục Coq về việc chấm dứt.


1
Bạn đã thử chuyển l và r với nhau như một sản phẩm thay vì sử dụng cà ri chưa? Điều đó sẽ giúp nó cùng.
Per Vognsen

1
Một số người nghĩ rằng câu hỏi này là về lập trình và ngoài phạm vi của trang web này. Mặc dù tôi không chắc chắn nếu tôi đồng ý, bạn có thể muốn biết về vấn đề tiềm năng. Nếu bất cứ ai có điều gì muốn nói về sự phù hợp, xin vui lòng viết vào cuộc thảo luận meta mà tôi liên kết đến.
Tsuyoshi Ito

3
Câu hỏi này thực sự là về việc chỉ định giới hạn giảm đơn điệu trên các cấu trúc dữ liệu để đảm bảo rằng hoạt động pairđược xác định rõ. Coq chỉ đơn thuần là phương tiện.
Dave Clarke

Câu trả lời:


12

Các định nghĩa điểm cố định của Coq yêu cầu các cuộc gọi quy nạp nhận được một đối số có cấu trúc nhỏ hơn. Sâu xa hơn, một cấu trúc fixpoint có một đối số duy nhất: không có khái niệm tích hợp nào về định nghĩa đệ quy trên hai đối số. May mắn thay, định nghĩa của Coq về cấu trúc nhỏ hơn bao gồm các loại bậc cao hơn, cực kỳ mạnh mẽ.

Định nghĩa điểm sửa hai đối số của bạn tuân theo một mẫu đơn giản: hoặc đối số thứ nhất trở nên nhỏ hơn hoặc đối số thứ nhất vẫn giống hệt nhau và đối số thứ hai trở nên nhỏ hơn. Mẫu khá phổ biến này có thể được xử lý bằng cách sửa lỗi đơn giản.

Fixpoint pair l := fix pair1 (r : Tree) :=
  match l with
    | Tip => match r with
              | Tip => TipTip
              | Bin rl rr => TipBin rl rr
            end
    | Bin ll lr => match r with
                    | Tip => BinTip ll lr
                    | Bin rl rr => BinBin (pair1 rl) (pair lr r)
                   end
  end.

Đối với các trường hợp phức tạp hơn, hoặc nếu thị hiếu của bạn chạy theo cách đó, bạn có thể sử dụng đệ quy gần hơn với cách nó được dạy trong các khóa học toán, xây dựng điểm cố định từ tính toán bước và lập luận riêng biệt , thường sử dụng thước đo số nguyên . Bạn cũng có thể làm cho định nghĩa của bạn trông giống như một chương trình cổ điển trong một ngôn ngữ không phải là toàn bộ với một chấm dứt riêng biệt bằng cách sử dụng Programbản địa .


Bây giờ tôi biết đây là những gì tôi yêu cầu!
yhirai

nó sẽ làm cho bất kỳ sự khác biệt nếu tôi đẩy fix pair1 rvào nhánh thứ hai của cấp cao nhất match(và tất nhiên điều chỉnh nhánh đầu tiên để trả về một loại chức năng phù hợp)?
ngày

@plmday: Cả hai cách làm việc. Chúng tương đương về mặt mở rộng đối với một số định nghĩa hợp lý về tính mở rộng và quan trọng hơn là cả hai đều được đánh máy tốt (việc viết lại mở rộng không thay đổi bất kỳ thuộc tính hiệp phương sai (tích cực) nào có liên quan).
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.