6.7.2. בדיקת מודל מבוססת SAT – Bounded Model Checking
המטרה שלנו היא להשתמש ב-SAT Solvers
כדי לבצע בדיקת מודל.
בהנתן נוסחה
ומבנה קריפקה M, נרצה
לקודד בדיקת מודל
לנוסחה פסוקית.
נציג כדוגמא טיפול בנוסחאות במבנה
, כאשר
נוסחה בוליאנית.
הגישה שנציג היא הפרכה ולא אימות: נקודד נוסחה פסוקית כך שאם יש השמה המספקת אותה יתקיים כי
. במידה וההשמה אינה מספקת את הנוסחה איננו יודעים
את המבנה מספק את הנוסחה, ונצטרך לבדוק נוסחה חדשה. נבצע בדיקת מודל חסומה.
הגדרת הבעיה: בהינתן מודל M, נוסף
(שקולה ל-
)
וחסם
, צריך לבדוק האם קיים מסלול ב-M באורך קטן או שווה ל-
ממצב התחלתי שמוביל למצב
המספק
. אם מצאנו השמה מספקת אז יתקיים כי
, כלומר
. אם לא מצאנו השמה מספקת נגדיל את
.
עצירה:
נעצור את התהליך במקרים הבאים: א. התפוצצות זכרון/זמן. ב. נמצא מסלול המוביל למצב
המספק
. ג. הגעה לחסם
מקסימלי על אורך המסלול, כך
שאם אין שגיאה עד חסם זה מובטח שאין שגיאה בכלל ומתקיים
.
בדיקת מודל חסומה עבור M ו-
:
- נקבע
(אפשרי לקבוע
)
- נבנה נוסחה פסוקית
המתארת את פרישת המודל
עד עומק
: הנוסחה תתאר את כל הרישות באורך
של מסלולים אפשריים ב-M ממצב התחלתי.
- נבנה נוסחה פסוקית
המתארת את כל הרישות באורך
המספקות את
.
- נבדוק האם הנוסחה
ספיקה. אם כן אז קיים
כך ש-
ולכן
.
נקודת מפתח להבנת נושא SAT: SAT
מקבלת נוסחה ומחזירה האם קיימת לה השמה מספקת. אם במקרה שלנו הנוסחה מייצגת מבנה
של מסלול חוקי, SAT מחזירה האם קיים מסלול כזה. אם קיימים מספר מסלולים, SAT תחזיר רק את קיומו של אחד מהם. (לכן SAT נוחה
להוכחת E ולא להוכחת A).
מתי אפשר לעצור את האלגוריתם?
- פתרון פשטני:
.
- חסם הדוק יותר:
. כאשר
הוא אורך המסלול בין
ל-
, כלומר אנחנו מחפשים את
המסלול הארוך ביותר מבין המסלולים הקצרים ביותר ממצב התחלתי את כל אחד
מהמצבים. בפועל חסם זה לא מעשי – מציאתו NP-שלמה.
איך מקבלים את הנתונים? איך בונים את
הנוסחה הפסוקית שנשלח אל SAT?
- מודל
, כאשר
זו קבוצת המצבים,
רלציית המעברים
קבוצת המצבים ההתחלתיים ו-
פונקצית הסימון.
- כל מצב מתואר
על ידי קידוד בינארי של משתנים בוליאנים
.
- נוסחה פסוקית
המתארת את המצבים ההתחלתיים:
.
- עבור
(בודקים
): נוסחה פסוקית לתיאור המצבים המספקים את
שנסמנה
.
- נוסחה פסוקית
המתארת את רלציית המעברים

בניית הפונקציות:
- נסמן
.
- נגדיר את
בצורה הבאה:

- הנוסחה עבור
וחסם
:

- אם ידוע
שאנחנו בודקים
באופן רציף, אפשר להשתמש בנוסחה
. הסבר:
פירושו שאין שגיאה במצבים
ההתחלתיים.
פירושו שאין שגיאה במצבים
במרחק 1.
דוגמא
Shift register עם 3 ביטים . כל פעם שמכניסים ביט כל
הביטים זזים תא אחד שמאלה. המפרט דורש שתמיד ביט אחד לפחות יהיה שווה ל-0. |
 |


אנחנו רוצים לבדוק האם
. כדי לבצע זאת נבדוק את השלילה:
![plot:$EF\left[
{\left( {x = 1} \right) \wedge \left( {y = 1} \right) \wedge \left( {z = 1}
\right)} \right]$](/documentResources/326/plot_1778.png)
ומכאן:

נרשום את הנוסחאות עבור
:

דוגמא להשמה מספקת:
 |
 |
 |
|
 |
 |
 |
|
 |
 |
 |
1 |
0 |
1 |
|
0 |
1 |
1 |
|
1 |
1 |
1 |
מצב התחלתי  |
|
מצב 1 -  |
|
מצב 2 -  |
נשים לב שקיימת גם השמה מספקת באורך
:
.