2012-12-01 33 views
5

Tôi hiện đang làm việc với vellvm, phát triển một chuyển đổi trên đó. Tôi là một người mới.Làm cách nào để tránh lỗi tràn hoặc lỗi phân đoạn trong Coq nats?

Trong khi lập trình, tôi phải đối mặt với cảnh báo sau đây:

Warning: Stack overflow or segmentation fault happens when working with large numbers in nat (observed threshold may vary from 5000 to 70000 depending on your system limits and on the command executed).

chức năng của tôi mà tạo ra cảnh báo này sẽ tính toán một chữ ký. Chữ ký được chia thành các bit cao cấp và kém hơn. Với hai nats n1 và n2 đại diện cho các bit cao cấp và các bit kém hơn, nó tính toán (n1 * 65536) + n2 - đây là một sự trừu tượng để đặt hai số nhị phân 16 bit cạnh nhau.

Tôi khá ngạc nhiên vì định nghĩa coq nat xuất hiện để xử lý các int lớn từ bên ngoài, nhờ vào hàm tạo S.

Tôi nên tránh cảnh báo này/sử dụng số lớn trong coq như thế nào? Tôi đang mở để thay đổi việc triển khai từ nat thành một số loại xây dựng nhị phân.

Cảm ơn!

+0

Làm việc với nats là crufty, vì chúng được xây dựng với 'S', nghĩa là mọi số sẽ * theo nghĩa đen * là một chuỗi các ứng dụng' S': bạn có thể làm việc với các số nguyên thay thế, có nguyên tắc chứng minh tương tự nhưng có ký hiệu đại diện dựa trên ký hiệu (bit): http://coq.inria.fr/library/Coq.ZArith.BinInt.html –

+0

Tôi có thể sử dụng các hoạt động sau đó như thế nào? (Zpos 1) + (Zpos 2) dường như không hoạt động ... - Lỗi: Thuật ngữ "1% Z" có loại "|" trong khi nó được mong đợi có kiểu "nat". – fotanus

+0

đó là vì "+" có nghĩa là nhiều thứ tùy thuộc vào vị trí của bạn. Trong thực tế "+" chỉ là đường cú pháp để thêm nats, trong đó 'plus' được định nghĩa một cách có cấu trúc trên hai loại nats. Bạn muốn sử dụng 'plus' cho các số nguyên, nằm trong một phạm vi _interpretation khác với' nat' (cụ thể là 'Int_scope'). Đọc về phạm vi diễn giải và cách mở chúng và sử dụng chúng. –

Trả lời

4

Thay vì sử dụng loại nat trong Coq, đôi khi (khi bạn phải thao tác số lớn) tốt hơn để sử dụng loại Z, đây là sự chính thức hóa các số nguyên sử dụng biểu diễn cặp độ lớn dấu. Sự cân bằng là bằng chứng của bạn có thể phức tạp hơn một chút; nat rất đơn giản và do đó thừa nhận các nguyên tắc chứng minh đơn giản.

Tuy nhiên, trong Coq, có một cách sử dụng rộng rãi ký hiệu để làm cho nó dễ dàng hơn để viết các định nghĩa, định lý và chứng minh. Coq có một hạt nhân cực nhỏ (chúng tôi muốn điều này bởi vì chúng tôi muốn có thể tin rằng trình kiểm tra bằng chứng là chính xác, và chúng tôi có thể đọc điều đó) với nhiều ký hiệu trên đầu trang của nó. Tuy nhiên, vì có những biểu diễn khác nhau của sự vật, và chỉ có một vài biểu tượng tốt, ký hiệu của chúng tôi thường xung đột. Để vượt qua điều này, coq sử dụng interpretation scopes để phân biệt các ký hiệu và phân giải chúng thành các tên (vì "+" có nghĩa là add, plus, v.v ...).

Bạn chính xác, sử dụng Z_scope là ở đâu, + cho plus trong vòng Z.

Các vấn đề liên quan