با tla+ pt.1 سخت نمی میرید

مقدمه
این اولین پست وبلاگ در سری Concpectus دوره “مقدمه TLA+” توسط لسلی لامپورت است. این به طور مستقیم از ساختار دوره پیروی می کند و برای کسانی که دوره را طی می کنند ، مرجع خوبی خواهد بود زیرا اطلاعات و توضیحات اضافی را به مطالب دوره اضافه می کند. بنابراین تمام اعتبارات مربوط به لسلی لامپورت و دوره وی است که می توانید در وب سایت وی پیدا کنید.
TLA + مبتنی بر منطق زمانی است ، بنابراین ممکن است در مورد برنامه های LTL و CTL ما برای پست وبلاگ امنیتی قراردادهای هوشمند در مورد آن بخوانید.
Inrotuction برای آمدن+
tla+ یک زبان برای سطح بالایی (سطح طراحی ، بالاتر از کد) سیستم ها (ماژول ها ، الگوریتم ها و غیره) مدل سازی و از اجزای زیر تشکیل شده است:
- TLC – چک کننده مدل ؛
- TLAPS – سیستم اثبات TLA+ ؛
- جعبه ابزار TLA+ – IDE.
TLA+ از سیستم برای مدل سازی استفاده می شود قطعات بحرانی سیستم های دیجیتالی ، انتزاع قطعات کمتر بحرانی و جزئیات اجرای سطح پایین. TLA+ برای طراحی همزمان و سیستم های توزیع شده به منظور کمک به یافتن و تصحیح خطاهای طراحی پیدا کردن آن با آزمایش و پیش از نوشتن هر خط کد.
opencomrtos یک سیستم عامل شبکه تجاری محور و در زمان واقعی است [3] که به شدت از TLA+ در طی فرآیند طراحی و توسعه استفاده می شود و تجربه خود را در کتاب آزادانه در دسترس به اشتراک می گذارد [4]بشر و نشان داد که استفاده از طراحی با قدردانی ، اندازه پایه کد و تعداد خطاها را کاهش می دهد و نمای مهندسی را به طور کلی تقویت می کند.
در نتیجه ، TLA+ برنامه نویسان و مهندسان را ارائه می دهد یک روش جدید برای تفکر این که آنها را به برنامه نویسان و مهندسان بهتر می کند حتی وقتی TLA+ مفید نیست. TLA+ مهندسان را مجبور می کند تا با انتزاعی تر فکر کنند.
انتزاع – روند از بین بردن جزئیات بی ربط و مهمترین بخش مهندسی. بدون آنها ، ما نمی توانیم سیستم های کوچک را طراحی و درک کنیم.
نمونه ای از استفاده از TLA+ در یک شرکت عظیم برای تأیید سیستمی که بسیاری از ما روزانه از آن استفاده می کنیم ، خدمات وب آمازون است. آنها از TLA+ برای تأیید صحت الگوریتم های توزیع شده و طراحی سیستم AWS استفاده می کنند [5]بشر مشکل الگوریتم ها و ارتباطات در سیستم های توزیع شده به خوبی در مقاله لسلی لامپورت “زمان ، ساعت و ترتیب وقایع در یک سیستم توزیع شده” شرح داده شده است. [6]بشر
یک طراحی سیستم به روشی رسمی بیان شده است مشخصاتبشر
مشخصات-مدل دقیق سطح بالا.
TLA+ مشخصات را تعریف می کند ، اما نمی تواند کد را تولید کند. اما این امر به معماری بسیار واضح تر کمک می کند و در بعضی موارد کد جمع و جور دقیق تر ، دقیق تر می نویسد. قادر است خواصی را که در یک اجرای فردی بیان می کند ، بررسی کند (یک سیستم در صورتی که هر اعدام آن را برآورده کند ، یک ملک را برآورده می کند).
انتزاع اساسی TLA+ به شرح زیر است: اجرای یک سیستم به عنوان دنباله ای از مراحل گسسته نشان داده می شود ، جایی که یک مرحله تغییر از یک حالت به حالت بعدی است:
- گسسته-تکامل مداوم دنباله ای از وقایع گسسته است (رایانه یک سیستم مبتنی بر رویدادهای گسسته است).
- دنباله – یک سیستم همزمان را می توان با یک برنامه متوالی شبیه سازی کرد.
- مرحله – تغییر دولت ؛
- حالت – واگذاری مقادیر به متغیرها.
رفتار – دنباله ای از حالت ها.
یک دستگاه دولتی در زمینه سیستم TLA+ توسط:
- همه حالتهای اولیه ممکن – [what the variables are] وت [their possible initial values]؛
- چه کشورهای بعدی می توانند از هر حالت معین پیروی کنند – رابطه ای بین ارزشهای آنها در وضعیت فعلی و ارزشهای احتمالی آنها در حالت بعدی.
- اگر وضعیت بعدی امکان پذیر نباشد ، متوقف می شود.
حالت کنترل – بیانیه بعدی که باید اجرا شود.
دستگاه های دولتی جزئیات اجرای سطح پایین را از بین می برند ، و TLA+ زبانی برای توصیف ماشین های دولتی است.
ماشین های دولتی در TLA+
TLA+ از ریاضی معمولی و ساده استفاده می کند. برای موارد زیر یک مثال دستگاه حالت تعریف شده را در نظر بگیرید C
رمز
int i;
void main()
{
i = someNumber();
i = i + 1;
}
برای تبدیل این کد به تعریف دستگاه TLA+ حالت ، باید جریان اجرای این کد را به حالت ها (مجموعه متغیرها) بسته بندی کنیم. برای مثال داده شده ، نحوه تعریف آن واضح است i
متغیر اما ما همچنین باید حالت کنترل را فوری کنیم. ما آن را صدا می کنیم pc
مانند:
-
pc = "start"
=i = someNumber();
-
pc = "middle"
=i = i + 1;
-
pc = "done"
= اعدام به پایان رسیده است.
برای این مثال فرض کنید someNumber()
یک عدد صحیح را از [0:1000]
فاصله
برای تعریف سیستم باید تعریف کنیم اولی حالت سیستم طرف دیگر وضعیت سیستم ممکن ، به عنوان یک فرمول بیان شده است که می تواند از وضعیت فعلی حاصل شود.
اینجا است فرمول از C
کد بالا ، نه توالی اجرای.
- فرمول حالت اولیه:
(i = 0) /\ (pc = "start")
- فرمول حالت بعدی:
\/ /\ pc = "start"
/\ i' \in 0..1000
/\ pc' = "middle"
\/ /\ pc = "middle"
/\ i' = i + 1
/\ pc' = "done"
از آنجا که این فرمول است ، به خصوصیات فرمول مانند رفت و آمد ، همبستگی و غیره احترام می گذارد.
فرمول های فرعی نیز می توانند در تعاریف خود استخراج شوند تا مشخصات بیشتری جمع کنند.
A == /\ pc = "start"
/\ i' \in 0..1000
/\ pc' = "middle"
B == /\ pc = "middle"
/\ i' = i + 1
/\ pc' = "done"
Next == A \/ B
از این مشخصات ، می بینیم که دو امکان وجود دارد ایالات بعدی که می تواند از ابتدا حاصل شود اولی دولت A
آغاز اعدام را بیان می کند و یک شماره را به آن اختصاص می دهد i
و حرکت به سمت بعدی pc
حالت برابر است p'
با B
افزایش می دهد i
و حرکت به حالت نهایی.
منابع و ابزارها
منابع یادگیری زیادی از TLA+وجود ندارد. با این حال ، مواردی وجود دارد که باید به آنها اشاره کنیم:
بررسی مدل
حال ، اجازه دهید در مورد موضوعات مربوط به TLC و مدل بررسی مدل صحبت کنیم.
TLC تمام رفتارهای احتمالی مجاز توسط مشخصات را محاسبه می کند. به طور دقیق تر ، TLC بررسی می کند مدل مشخصات
- گزارش های TLC بن بست اگر اعدام متوقف شود وقتی قرار نبود ؛
- گزارش های TLC خاتمه اگر اعدام وقتی قرار بود متوقف شود.
TLA+ اجازه نوشتن قضایای و اثبات رسمی آن قضیه ها را می دهد.
tlaps (TLA
سیستم اثبات) ابزاری برای بررسی این اثبات است ، می تواند اثبات صحت الگوریتم ها را بررسی کند.
عملاً ، اصطلاح نشان (مشخصات) به معنای:
- مجموعه ماژول ها ، از جمله ماژول های وارداتی شامل
.tla
پرونده ها - در
TLA
فرمول مجموعه رفتارهای مجاز سیستم یا الگوریتم را مشخص می کند.
مشخصات ممکن است حاوی چندین مدل باشد. این مدل به TLC می گوید چه کاری باید انجام دهد. در اینجا بخش هایی از مدل وجود دارد که باید صریحاً انتخاب شوند:
- مشخصات رفتار چیست (مشخصات رفتار فرمول یا جفت فرمولهایی است که رفتارهای احتمالی سیستم یا الگوریتمی را که می خواهید بررسی کنید توصیف می کند).
- چه TLC باید بررسی کند.
- چه مقادیری برای جایگزینی پارامترهای ثابت.
مشخصات رفتار
دو روش برای نوشتن مشخصات رفتار وجود دارد:
-
آغاز و بعدی
- یک جفت فرمول که به ترتیب وضعیت اولیه و رابطه بعدی را مشخص می کنند.
-
تک فرمول
- یک فرمول زمانی واحد از فرم
Init and [][Next]_{vars} and F
، کجا-
Init
محمول اولیه است ؛ -
Next
رابطه دولت بعدی است ؛ -
vars
تپل متغیرها است. - وت
F
یک فرمول انصاف اختیاری است.
-
- یک فرمول زمانی واحد از فرم
تنها راه برای نوشتن مشخصات رفتاری که شامل انصاف است ، با یک فرمول زمانی است ، در غیر این صورت ، یک مشخصات متغیرهایی نخواهد داشت و در این حالت ، TLC فرضیات را بررسی می کند و یک بیان ثابت را ارزیابی می کند.
سه نوع خاصیت از مشخصات رفتار وجود دارد که TLC می تواند بررسی کند:
- بن بست – الف بن بست گفته می شود که در وضعیتی رخ می دهد که رابطه دولت بعدی اجازه نمی دهد دولت جانشین باشد.
- متغیر -یک محمول حالت که در مورد همه حالت های قابل دسترسی صادق است-یعنی حالت هایی که می توانند در یک رفتار مجاز توسط مشخصات رفتار رخ دهند.
- خواص -TLC می تواند بررسی کند که آیا مشخصات رفتار یک خاصیت زمانی را برآورده می کند (دلالت می کند) ، که به عنوان یک فرمول-logic موقتی بیان شده است یا خیر.
مدل
ابتدایی ترین بخش یک مدل مجموعه ای از تکالیف مقادیر به ثابت اعلام شده است.
تکلیف عادی
می توان مقدار ثابت را بر روی هر عبارت TLA+ ثابت که فقط نمادهای تعریف شده در مشخصات را شامل می شود ، تنظیم کرد. این عبارت حتی می تواند شامل ثابت های اعلام شده باشد ، تا زمانی که مقدار اختصاص یافته به ثابت به آن بستگی ندارد (وابستگی های دایره ای فرار). یک مدل باید مقادیر تمام ثابت های اعلام شده را مشخص کند.
مقدار مدل
مقدار مدل یک مقدار نامشخص است که TLC می داند برای هر مقداری که می توانید در TLA+بیان کنید نابرابر است. می توانید مجموعه را جایگزین کنید {p1, p2, p3\}
از سه مقدار مدل برای Proc
بشر اگر به اشتباه عبارتی بنویسید مانند p+1
جایی که ارزش p
یک فرآیند است ، TLC هنگام تلاش برای ارزیابی این عبارت ، خطایی را گزارش می کند زیرا می داند که یک فرآیند یک مقدار مدل است و بنابراین یک عدد نیست. یک دلیل مهم برای جایگزینی مجموعه ای از مقادیر مدل برای Proc
این است که اجازه دهید TLC از تقارن استفاده کند.
مثال:
NotANat == CHOOSE n : n \notin Nat
تعریف می کند
NotANat
یک مقدار دلخواه بودن که یک عدد طبیعی نیست. TLC نمی تواند این تعریف را ارزیابی کند زیرا نمی تواند بی حد و مرز را ارزیابی کندCHOOSE
بیان برای اجازه دادن به TLC برای رسیدگی به مشخصات ، باید مقدار مدل را جایگزین کنیدNotANat
بشر بهترین مقدار مدل برای جایگزینی آن یکی از آنها نامگذاری شده استNotANat
بشر این کار با تعریف نادیده گرفتن انجام می شود. جعبه ابزار TLA+ در صورت ایجاد یک مدل در صورت تعریفی که دارای نحو دقیق در بالا یا نحو باشد ، ورود مناسب را در آن بخش ایجاد می کند:NotANat == CHOOSE n: ~(n \in Nat)
، کجاNat
می تواند هر بیان باشد ، وNotANat
وتn
می تواند هر شناسه ای باشد.
مقادیر مدل را می توان به شرح زیر تایپ کرد: یک مقدار مدل دارای نوع است T
اگر و فقط اگر نام آن با دو شخصیت شروع شود T_
بشر
مقدار مدل اعلام شده در مدل می تواند به عنوان یک مقدار معمولی در هر عبارتی که بخشی از مشخصات مدل است استفاده شود.
تقارن
مشخصات سیستم حافظه حاوی ثابت اعلام شده را در نظر بگیرید Val
این نشان دهنده مجموعه مقادیر احتمالی یک ثبت حافظه است. مجموعه Val
مقادیر احتمالاً a است مجموعه برای مشخصات رفتار سیستم حافظه ، به این معنی که اجازه دادن عناصر در مجموعه مقادیر تغییر نمی کند که آیا یک رفتار آن مشخصات رفتار را برآورده می کند یا خیر. TLC می تواند از این امر برای سرعت بخشیدن به بررسی خود استفاده کند. فرض کنید ما یک مجموعه را جایگزین می کنیم {v1, v2, v3}
از مقادیر مدل برای Val
بشر ما می توانیم از مجموعه گزینه ای برای اعلام این مجموعه از مقادیر مدل به عنوان مجموعه تقارن از مشخصات رفتار است. این باعث می شود تعداد حالتهای قابل دستیابی که TLC باید تا حداکثر بررسی کند ، کاهش دهد 3!
، یا 6
بشر
می توانید بیش از یک مجموعه از مقادیر مدل را به عنوان یک مجموعه تقارن اعلام کنید. با این حال ، اتحاد همه مجموعه های تقارن نمی تواند حاوی دو مقدار مدل تایپ شده با انواع مختلف باشد.
TLC بررسی نمی کند که آیا مجموعه ای که شما اعلام می کنید یک مجموعه تقارن است ، واقعاً یکی است. اگر یک مجموعه را به عنوان یک مجموعه تقارن اعلام کنید و اینگونه نیست ، پس TLC می تواند خطایی را پیدا کند که در غیر این صورت پیدا می کند. یک عبارت است متقارن برای یک مجموعه S
اگر و فقط در صورت تعویض هر دو مقدار S
مقدار بیان را تغییر نمی دهد. بیان {{v1, v2}, {v1, v3}, {v2, v3}}
متقارن برای مجموعه است {v1, v2, v3}
– به عنوان مثال ، تعویض v1
وت v3
در این بیان تولید می شود {{v3, v2}, {v3, v1}, {v2, v1}}
، که برابر با بیان اصلی است. شما باید یک مجموعه را اعلام کنید S
مقادیر مدل به عنوان یک تقارن فقط در صورتی که مشخصات و کلیه خصوصیاتی که بررسی می کنید متقارن است S
پس از تعویض ثابت ها و اپراتورهای تعریف شده مشخص شده توسط مدل انجام می شود. به عنوان مثال ، شما نباید اعلام کنید {v1, v2, v3}
در صورت جایگزینی مدل ، یک مجموعه تقارن باشد v1
برای برخی ثابت تنها اپراتور TLA+ که می تواند هنگام استفاده از یک بیان متقارن یک عبارت غیر متقارن ایجاد کند CHOOSE
بشر به عنوان مثال ، عبارت CHOOSE x \in {v1, v2, v3} : TRUE
متقارن نیست {v1, v2, v3}
بشر
از مجموعه های تقارن نباید هنگام بررسی خصوصیات زنده بودن استفاده شود. انجام این کار می تواند باعث شود TLC در یافتن خطا ، یا گزارش خطاهای وجود ندارد.
سخت مرگ
Die Hard یک فیلم اکشن از سال 1988 است. در این فیلم ، صحنه ای وجود دارد که قهرمانان ما برای غیرفعال کردن یک بمب باید با دو کوزه مشکل حل کنند. مشکل اندازه گیری 4 گالن آب با استفاده از کوزه های 3 و 5 گالن است.
برای طرح ، جستجو کنید: “مشکل کوزه های سخت” در YouTube یا به سادگی اینجا را کلیک کنید. ما این مشکل را با استفاده از TLA+حل خواهیم کرد.
https://www.youtube.com/watch؟v=2vdf6nasmie
اول ، ما باید رفتار را بنویسیم. اجازه دهید مقادیر از small
وت big
تعدادی گالن را در هر کوزه نشان دهید.
\ شروع {bmatrix} کوچک و 0 \ big & 0 \ \ end {bmatrix} \ rightarrow \ start {bmatrix} کوچک و 3 \ big & 0 \ end {bmatrix} \ rightarrow \ {bmatrix} small & 0 \ big بزرگ & 3 \ \ end {bmatrix} \ RightArrow \ شروع {bmatrix} کوچک و 3 \ big & 3 \ \ end {bmatrix} \ rightarrow …
پر کردن کوزه یک مرحله واحد است. هیچ مرحله میانی وجود ندارد.
مشخصات واقعی برای از بین بردن انواع خطاها نوشته شده است.
TLA+ هیچ نوع اعلامیه ای ندارد. با این حال ، تعریف فرمولی که صحت نوع را اثبات می کند ، مهم است. این به درک مشخصات کمک می کند و TLC می تواند با بررسی اینکه آیا چنین فرمولی همیشه است ، انواع را بررسی کنید true
بشر
TypeOK == /\ small \in 0..3
/\ big \in 0..5
در اینجا ، ما آن را تعریف می کنیم small
یک عدد صحیح در محدوده است [0:3]
وت big
یک عدد صحیح در محدوده است [0:5]
بشر اما این تعریف بخشی از مشخصات نیست.
در فرمول حالت اولیه Init == small = 0 /\ big = 0
وضعیت اولیه سیستم را تعریف می کند.
در فرمول حالت بعدی نقل و انتقالات احتمالی را از ایالت به ایالت تعریف می کند و معمولاً به صورت نوشته می شود F_1 or F_2 or ... or F_n
، جایی که هر فرمول F_i
نوع دیگری از گام را امکان پذیر می کند.
مشکل ما 3 نوع مرحله دارد:
- یک کوزه را پر کنید
- یک کوزه خالی ؛
- از یک کوزه به دیگری بریزید.
ما مشخصات را به شرح زیر تعریف می کنیم:
Next == \/ FillSmall \* fill the small jug
\/ FillBig \* fill the big jug
\/ EmptySmall \* empty the small jug
\/ EmptyBig \* empty the big jug
\/ SmallToBig \* pour water from small jug in the big jug
\/ BigToSmall \* pour water from the big jug in the small jug
نام تعاریف (مانند
FillSmall
، و غیره) باید قبل از استفاده تعریف شود (پیش از تعریفNext
).
FillSmall == /\ small' = 3
/\ big' = big
هنگام تعریف فرمول ها ، ما باید در نظر داشته باشیم که سیستم به عنوان یک کل و در مورد مراحل به عنوان انتقال از یک حالت به حالت دیگر فکر کنیم. در مورد ما ، این بدان معنی است که ما نمی توانیم تعریف کنیم FillSmall
به عنوان FillSmall == small' = 3
از آنجا که این فرمول بخشی از قسمت دوم وضعیت برنامه را ندارد (big
). به عبارت دیگر ، این فرمول تبدیل می شود true
اگر small'
برابر است 3
وت big'
برابر با هر چیزی است. اما این درست نیست. در حقیقت ، اگر کوزه کوچک را پر کنیم ، کوزه بزرگ را در حالت نگه می داریم و بدون تغییر است.
اکنون ، ما تعریف می کنیم SmallToBig
بشر دو مورد احتمالی وجود دارد که باید در نظر بگیریم:
SmallToBig == /\ IF big + small <= 5
THEN /* There is room -> empty small.
ELSE /* There is no room -> fill big.
SmallToBig == /\ IF big + small <= 5
THEN /\ big' = big + small
/\ small' = 0
ELSE /\ big' = 5
/\ small' = small - (5 - big)
------------------------------ MODULE DieHard ------------------------------
EXTENDS Integers
VARIABLES small, big
TypeOK == /\ small \in 0..3
/\ big \in 0..5
Init == /\ big = 0
/\ small = 0
FillSmall == /\ small' = 3
/\ big' = big
FillBig == /\ big' = 5
/\ small' = small
EmptySmall == /\ small' = 0
/\ big' = big
EmptyBig == /\ big' = 0
/\ small' = small
SmallToBig == IF big + small =< 5
THEN /\ big' = big + small
/\ small' = 0
ELSE /\ big' = 5
/\ small' = small - (5 - big)
BigToSmall == IF big + small =< 3
THEN /\ big' = 0
/\ small' = big + small
ELSE /\ big' = big - (3 - small)
/\ small' = 3
Next == \/ FillSmall
\/ FillBig
\/ EmptySmall
\/ EmptyBig
\/ SmallToBig
\/ BigToSmall
=============================================================================
اگر مدلی را برای این مشخصات ایجاد و اجرا کنیم ، هیچ خطایی نخواهیم دید و این خوب است. با این حال ، هیچ ثابت خاص از مشخصات ما را بررسی نمی کند.
ثابت فرمولی است
true
در هر حالت قابل دستیابی
ما تعریف کرده ایم TypeOK
به عنوان یک نوع تعریف برای small
وت big
، بنابراین ما می توانیم این فرمول را به عنوان یک ثابت اضافه کنیم تا بررسی کنیم که این ثابت شکسته نشده است.
اگر اکنون آن را اجرا کنیم ، هنوز هیچ خطایی نمی بینیم small
وت big
احترام به انواع آنها در هر حالت قابل دستیابی.
اکنون می توانیم حل کنیم مودب مشکل ریختن big
دقیقاً با 4 گالن آب. برای انجام آن ، ما یک ثابت جدید اضافه می کنیم big /= 4
به بخش متغیرها.
در اینجا ، این ثابت به عنوان یک نمونه متقابل عمل می کند. ثابت یک فرمول است که به آن تبدیل می شود true
در هر حالت قابل دسترسی ما باید یک حالت (در واقع یک دنباله حالت) پیدا کنیم big = 4
، بنابراین ما این را توسط /=
نمادی که برابر است neq
بشر با استفاده از این فرمول جدید ، اگر مدل را اجرا کنیم ، خطایی پیدا می کند (وضعیتی که یک متغیر شکسته است) و دنباله ای از حالت هایی را نشان می دهد که منجر به این حالت می شود.
اکنون می توانیم مراحل دقیقی را که برای حل مشکل لازم است انجام دهیم و قهرمانان ما بتوانند حرکت کنند.
انتشار اصلی
منابع
- لسلی لامپورت. یادگیری tla +
- برنامه های LTL و CTL برای امنیت قراردادهای هوشمند
- OpenComrtos
- اریک ورهولست. توسعه رسمی RTO های محور شبکه. ژانویه 2011. 10،1007/978-1-4419-9736-4. ISBN: 978-1-4419-9735-7
- Chris Newcombe ، Tim Rath ، Fan Zhang ، Bogdan Munteanu ، Marc Brooker و Michael Deardeuff.How Services Web Amazon از روشهای رسمی استفاده می کند. 2015 ، ارتباطات ACM
- لسلی لامپورت. زمان ، ساعت و ترتیب وقایع در یک سیستم توزیع شده. 1978. ماساچوست همکاران رایانه ، شرکت