تأیید یک Rust اجرای پیوندهای رقص کنوت با استفاده از ACL2: پیوندهای رقص در زنگ

در این بخش، ما یک لیست دایره‌ای مبتنی بر آرایه با پیوند دوگانه (CDLL) را با استفاده از بهینه‌سازی «پیوندهای رقصی» Knuth، که با استفاده از زیرمجموعه RAR Rust انجام شده است، توصیف می‌کنیم. اجرای ساختار داده CDLL بیش از 700 خط کد Rust را تشکیل می دهد که با ترجمه به ACL2 به 890 خط کد تبدیل می شود.

6.1 تعاریف

ابتدا، ما اعلان اصلی RAR را برای CDLL ارائه می کنیم.

اعلان‌های ساختار داده‌های Rust مشابه موارد در C هستند، اما عناصر ساختار با مشخص کردن نام عنصر و به دنبال آن جداکننده: و سپس نوع عنصر اعلام می‌شوند. همچنین توجه داشته باشید که Rust pragmas ممکن است با استفاده از ویژگی derive داده شود. در اعلان بالا، آرایه nodeArr گره های عنصر لیست را نگه می دارد. هر عنصر دارای شاخص های بعدی و قبلی است. توجه داشته باشید که شاخص‌ها در Rust معمولاً از نوع usize هستند. همچنین توجه داشته باشید که با استفاده از شاخص‌های آرایه به جای ارجاعات، ما دور می‌شویم

شکل 4: تابع ()cdll_remove در RAR.شکل 4: تابع ()cdll_remove در RAR.

مشکلات مدل مالکیت زنگ با ساختارهای داده دایره ای. فیلد تخصیص ساختار CDLLNode به عنوان یک فیلد بدون علامت دو بیتی اعلام شده است، اما تنها مقادیر مجاز آن دو مقدار غیر صفر هستند: 2 (در حال حاضر تخصیص داده نشده) و 3 (تخصیص داده شده). دلیل این امر مربوط به جزئیات استدلال رکورد نشده ACL2 است که در بخش بحث خواهد شد.

Source link