Dafny - Dafny

Dafny
ParadigmaImperativ, Funktsional
LoyihalashtirilganK. Rustan M. Leino
TuzuvchiMicrosoft tadqiqotlari
Birinchi paydo bo'ldi2009; 11 yil oldin (2009)
Barqaror chiqish
2.3.0 / 2019 yil 7-may; 18 oy oldin (2019-05-07)
Matnni yozishStatik, kuchli, xavfsiz
LitsenziyaMIT litsenziyasi
Veb-sayttadqiqot.microsoft.com/ dafny

Dafny majburiydir tuzilgan til bu maqsadlar C # va qo'llab-quvvatlaydi rasmiy spetsifikatsiya orqali old shartlar, keyingi shartlar, loop invariantlari va pastadir variantlari. Til asosan fikrlarni birlashtiradi funktsional va majburiy paradigmalar va cheklangan qo'llab-quvvatlashni o'z ichiga oladi ob'ektga yo'naltirilgan dasturlash. Xususiyatlari quyidagilarni o'z ichiga oladi umumiy sinflar, dinamik ajratish, induktiv ma'lumotlar turlari va o'zgarishi ajratish mantig'i sifatida tanilgan yashirin dinamik ramkalar[1] yon ta'siri haqida mulohaza yuritish uchun.[2] Dafny rustan Leino tomonidan yaratilgan Microsoft tadqiqotlari ESC / Modula-3 ni ishlab chiqish bo'yicha avvalgi ishidan so'ng, ESC / Java va Spec #. Dafny o'qitishda keng qo'llaniladi va dasturiy ta'minotni tekshirish musobaqalarida muntazam ravishda funktsiyalar qo'llaniladi (masalan, VSTTE'08,[3] VSCOMP'10,[4] NARX, 11,[5] va tasdiqlang12[6]).

Dafny rasmiy spetsifikatsiya va tekshirishga oddiy kirish uchun mo'ljallangan va o'qitishda keng qo'llanilgan. Dafny Boogie-ga asos soladi oraliq til ishlatadigan Z3 avtomatlashtirilgan teorema prover majburiy majburiyatlarni bajarish uchun.[7][8]

Ma'lumot turlari

Dafny amalga oshirishi mumkin bo'lgan usullarni taqdim etadi yon effektlar va spetsifikatsiyada foydalanish funktsiyalari toza. Usullar tanish imperativ uslubga amal qilgan holda ketma-ketliklardan iborat bo'lib, aksincha, funktsiya tanasi shunchaki ifodadir. Metoddagi har qanday yon ta'sir ko'rsatadigan bayonotlar (masalan, qator parametr elementini tayinlash) qaysi parametrlarni mutatsiyaga olib kelishi mumkinligini hisobga olish kerak. o'zgartiradi band. Dafny shuningdek, bir qatorni taqdim etadi o'zgarmas to'plam turlari, shu jumladan: ketma-ketliklar (masalan, seq ), to'plamlar (masalan, ni o'rnating) va xaritalar (xaritasi ). Bunga qo'chimcha, o'zgaruvchan massivlar (masalan, qator ) taqdim etiladi.

Imperativ xususiyatlar

Dafny g'oyalariga asoslangan imperativ dasturlarning dalillarini qo'llab-quvvatlaydi Mantiqiylik. Quyida Dafny-dagi ko'plab bunday xususiyatlar, jumladan, old shartlar, postkonditsiyalar, tsikl invariantlari va tsikl variantlaridan foydalanish ko'rsatilgan.

usul maksimal(arr:qator<int>) qaytadi(maksimal:int) // Array kamida bitta elementga ega bo'lishi kerak talab qiladi arr!=bekor && arr.Uzunlik > 0; // Qaytish qatorning har qanday elementidan kichik bo'lishi mumkin emas ta'minlaydi (Barcha uchun j :int :: (j >= 0 && j < arr.Uzunlik ==> maksimal >= arr[j])); // Qaytish qatordagi ba'zi elementlarga mos kelishi kerak ta'minlaydi (mavjud j : int :: j>=0 && j < arr.Uzunlik && maksimal==arr[j]);{  maksimal:=arr[0];  var men:int :=1;  //  esa(men < arr.Uzunlik)  // eng ko'p arr.Length indentatsiyasi (i == arr.plusdan keyin uzunlikni ko'rsatish uchun kerak)  o'zgarmas (men<=arr.Uzunlik);  // Maks dan kattaroq element ko'rilmagan  o'zgarmas (Barcha uchun j:int :: j>=0 && j<men ==> maksimal >= arr[j]);  // Hozirgacha ko'rilgan ba'zi elementlar max bilan mos keladi  o'zgarmas (mavjud j:int :: j>=0 && j<men && maksimal == arr[j]);  // i == arr.Length bo'lganda tugatish  kamayadi (arr.Uzunlik-men);   {    // Agar kattaroq element duch kelsa, uni yangilang    agar(arr[men] > maksimal){maksimal := arr[men];}    // Massiv orqali davom eting    men := men + 1;  }}

Ushbu misollar massivning maksimal elementini hisoblab chiqadi. Usulning oldingi sharti va keyingi sharti bilan berilgan talab qiladi va ta'minlaydi bandlar (mos ravishda). Xuddi shu tarzda, loop invariant va loop varianti orqali berilgan o'zgarmas va kamayadi bandlar (mos ravishda).

Loop invariantlari

Dafnidagi halqa invariantlarini davolash an'anaviylardan farq qiladi Mantiqiylik. Bir tsikldagi mutatsiyaga uchragan o'zgaruvchilar shunday muomala qiladiki, tsikldan oldin ular haqida ma'lum bo'lgan (ko'p) ma'lumotlar bekor qilinadi. Bunday o'zgaruvchilarning xususiyatlarini isbotlash uchun zarur bo'lgan ma'lumotlar tsiklning o'zgarmasligida aniq ifodalanishi kerak. Aksincha, tsikldagi mutatsiyaga ega bo'lmagan o'zgaruvchilar ular haqida oldindan ma'lum bo'lgan barcha ma'lumotlarni saqlab qoladilar. Quyida quyidagilar tasvirlangan:

usul sumAndZero(ns:qator<int>) qaytadi (sum:nat)  talab qiladi ns != bekor  talab qiladi Barcha uchun men :: 0 <= men < ns.Uzunlik ==> ns[men] >= 0  o'zgartiradi ns {  var men:int := 0;  var arr:qator<int> := ns; // chunki parametrlarni tayinlash mumkin emas  sum := 0;  //  esa(men < arr.Uzunlik) {    sum := sum + arr[men];    arr[men] := arr[men];    men := men + 1;  }}

Bu tekshirib bo'lmadi, chunki Dafni buni aniqlay olmaydi (sum + arr [i])> = 0 topshiriqni bajaradi. Old shartdan, intuitiv ravishda, umuman i :: 0 <= i arr [i]> = 0 beri ko'chadan ushlab turadi arr [i]: = arr [i]; a Yo'q. Biroq, ushbu topshiriq Dafnining davolanishiga sabab bo'ladi arr o'zgaruvchan o'zgaruvchi sifatida va bu haqda ma'lum bo'lgan ma'lumotni ko'chadan oldin tushiring. Ushbu dasturni Dafny-da tekshirish uchun biz quyidagilarni amalga oshiramiz: ortiqcha topshiriqni olib tashlash arr [i]: = arr [i];; yoki, ko'chadan o'zgarmas qo'shing invariant forall i :: 0 <= i arr [i]> = 0

Dafny qo'shimcha ravishda cheklangan ish bilan shug'ullanadi statik tahlil iloji boricha oddiy tsikl invariantlarini chiqarish. Yuqoridagi misolda bu ko'chadan o'zgarmas bo'lib tuyuladi o'zgarmas i> = 0 o'zgaruvchan sifatida ham talab qilinadi men tsikl ichida mutatsiyaga uchragan. Asosiy mantiq bunday o'zgarmaslikni talab qilsa-da, Dafni buni avtomatik ravishda keltirib chiqaradi va shuning uchun uni manba darajasida qoldirish mumkin.

Tasdiqlash xususiyatlari

Dafny, undan foydalanishni yanada qo'llab-quvvatlaydigan xususiyatlarni o'z ichiga oladi dalil yordamchisi. A ichida oddiy xususiyatlarning dalillari funktsiya yoki usul (yuqorida ko'rsatilgandek) ushbu turdagi vositalar uchun g'ayrioddiy emas, Dafny shuningdek, ularning orasidagi xususiyatlarni isbotlashga imkon beradi funktsiya va boshqasi. A uchun odatdagidek dalil yordamchisi, bunday dalillar ko'pincha induktiv tabiatda. Dafny induktiv gipotezani qo'llash mexanizmi sifatida chaqiruv usulini qo'llashda g'ayrioddiydir. Quyidagilar tasvirlangan:

ma'lumotlar turi Ro'yxat = Yo'q | Havola(ma'lumotlar:int,Keyingisi:Ro'yxat)funktsiya sum(l:Ro'yxat): int {  o'yin l    ish Yo'q => 0    ish Havola(d,n) => d + sum(n)}predikat isNatList(l:Ro'yxat) {  o'yin l    ish Yo'q => to'g'ri    ish Havola(d,n) => d >= 0 && isNatList(n)}arvoh usul NatSumLemma(l:Ro'yxat, n:int)talab qiladi isNatList(l) && n == sum(l)ta'minlaydi n >= 0 {  o'yin l    ish Yo'q =>      // Avtomatik ravishda zaryadsizlanadi    ish Havola(ma'lumotlar,Keyingisi) => {      // Induktiv gipotezani qo'llang      NatSumLemma(Keyingisi,sum(Keyingisi));      // Dafni tomonidan ma'lum bo'lgan narsalarni tekshiring      tasdiqlash ma'lumotlar >= 0;    }}

Bu yerda, NatSumLemma foydali xususiyatni isbotlaydi o'rtasida sum () va isNatList () (ya'ni bu isNatList (l) ==> (sum (l)> = 0)). A dan foydalanish sharpa usuli kodlash uchun lemmalar va teoremalar Dafnyda standart bo'lib, indüksiyon uchun ishlatiladigan rekursiya (odatda, tarkibiy induksiya ). Ishni tahlil qilish yordamida amalga oshiriladi o'yin bayonotlar va induktiv bo'lmagan holatlar ko'pincha avtomatik ravishda bekor qilinadi. Tekshiruvchi shuningdek a tarkibiga to'liq kirish huquqiga ega bo'lishi kerak funktsiya yoki predikat kerak bo'lganda ularni ro'yxatdan o'tkazish uchun. Bilan birgalikda ishlatilganda bu o'z ta'sirini ko'rsatadi kirish modifikatorlari. Xususan, a tarkibini yashirish funktsiya yordamida himoyalangan modifikator bu borada qanday xususiyatlarni o'rnatishni cheklashi mumkin.

Adabiyotlar

  1. ^ Smans, Jan; Jeykobs, Bart; Piessens, Frank (2009). Yashirin dinamik ramkalar: Dinamik ramkalar va ajratish mantig'ini birlashtirish. Ob'ektga yo'naltirilgan dasturlash bo'yicha Evropa konferentsiyasi konferentsiyasi materiallari. 148–172 betlar. doi:10.1007/978-3-642-03013-0_8.
  2. ^ Leino, Rustan (2010). Dafny: Funktsional to'g'rilik uchun dasturni tasdiqlovchi avtomatik dastur. Dasturlash, sun'iy intellekt va mulohaza yuritish uchun mantiq bo'yicha konferentsiya materiallari. 348-370 betlar. doi:10.1007/978-3-642-17511-4_20.
  3. ^ Leino, Rustan; Monaxon, bibariya (2010). Dafny tekshiruv sinovlari sinoviga javob beradi (PDF). Tasdiqlangan dasturiy ta'minot bo'yicha xalqaro konferentsiya: nazariyalar, vositalar va tajribalar. 112–116 betlar. doi:10.1007/978-3-642-15057-9_8.
  4. ^ Klebanov, Vladimir; va boshq. (2011). Dasturiy ta'minotning 1-tanlovi: tajriba haqida hisobot. Rasmiy usullar bo'yicha konferentsiya materiallari. 154–168 betlar. CiteSeerX  10.1.1.221.6890. doi:10.1007/978-3-642-21437-0_14.
  5. ^ Bormer, Thorsten; va boshq. (2011). COST IC0701 tasdiqlash tanlovi 2011 yil. Ob'ektga yo'naltirilgan dasturiy ta'minotni rasmiy tekshirish bo'yicha konferentsiya materiallari. 3-21 betlar. CiteSeerX  10.1.1.396.6170. doi:10.1007/978-3-642-31762-0_2.
  6. ^ Xyuzman, Marieke; Klebanov, Vladimir; Monaxon, bibariya (2015). "VerifyThis 2012: Dasturni tasdiqlash bo'yicha tanlov" (PDF). Texnologiyalarni uzatish uchun dasturiy vositalar bo'yicha jurnal. 17 (6): 647–657. doi:10.1007 / s10009-015-0396-8.
  7. ^ "Z3 bosh sahifasi". 2019-02-07.
  8. ^ de Moura, Leonardo; Byorner, Nikolay (2008). Z3: samarali SMT echim. Qurilish va tahlil qilish vositalari va algoritmlari bo'yicha konferentsiya materiallari. 337-340 betlar. doi:10.1007/978-3-540-78800-3_24.

Tashqi havolalar