2017-09-15 87 views
1

我開始使用Promela,並且在表達一些LTL公式時遇到問題。參考Promela LTL聲明中的以前狀態

一個示例是以下sequence值,我想斷言是單調增加。直覺上我想在下一個狀態中寫,順序是> =其前值,但是通過查看文檔,我沒有看到一種方式來表達這一點。有沒有一種方法來表達這種類型的公式?

byte sequence = 0; 
ltl p0 { [] sequence >= prev(sequence) } 
... processes that manipulate sequence ... 

假設它可能表達上述的sequence單調增加的財產,我想知道如果有一個通配符數組索引語法。類似於上面的例子,我直觀地想引用所有以前的索引條目。

byte values[N]; 
byte index = 0; 
ltl p1 { values[0..index-1] are monotonically increasing } 
... processes ... 

非常感謝您的幫助。 PROMELA似乎真的很棒:)

+0

我很欣賞你的問題。 ** a)** *單調遞增*函數是s.t. f(x + 1)> f(x)',則您編碼*單調非遞減*函數,即f(x + 1)> = f(x)'。在我的回答中,我認爲比較運算符'> ='是你想要的。 ** b)**包含[多個看似無關的問題](https://meta.stackexchange.com/questions/120633/what-do-we-do-with-with-multiple-question-questions)的問題應該是真的分成多個問題;它可以更輕鬆地查詢重複項,因爲標題可以更緊密地匹配問題的內容,並且可以產生更清晰的* Q/A *。 –

+0

謝謝帕特里克。我仍然需要深入解答你的答案,但是關於一個職位中的多個問題:我應該知道的更好。有沒有分裂的方法?我可以編輯這篇文章,併爲第二部分重新提交另一個問題? –

+0

這似乎是最明智的選擇,雖然我的意圖僅僅是作爲未來的建議。我不認爲有人會打擾你的帖子,關於這個問題:我們目前在一個非常小的,緊隨其後的stackoverflow子社區。 * 1-rep *用戶在這裏有很多*多個問題包裝的問題*,我建議這樣做的唯一原因是因爲您有*高級代表*。我幾次更新了我的答案,以防您錯過任何東西。 –

回答

1

據我所知,

單調非減序列。

線性時序邏輯具有X操作者,允許一個表達是指保持在下一狀態一個布爾條件,而不是在先前狀態的性質。

然而,可以不直接與一個LTL式中的下一個狀態的比較當前狀態的整數值,因爲X評估爲布爾值。

從理論上講,有什麼可以做的是位爆破它,例如編碼的<=運營商在整數布爾屬性通過一些巧妙地利用了模運算的手段或位運算(它不應該是無符號的變量太用力)和相應的布爾值位對位比較(見最後注)

然而,從建模的角度來看,最簡單的方法是使用prev_value變量豐富您的模型,並簡單地檢查在每個狀態下屬性prev_value <= cur_value是否成立。請注意,在這種情況下,您應該使用命令d_step將兩個值分配組合在一起,以便它們在單個狀態下合併,不存在中間轉換,例如

... 
byte prev_value; 
byte cur_value; 
... 
d_step { 
    prev_value = cur_value; 
    cur_value = ... non-blocking function ... 
} 

否則,關於prev_valuecur_value不變性可能導致在相應的自動機被打破一些狀態s_i(注:這實際上不會妨礙特定LTL財產你有興趣的驗證,但它可以與其他公式的問題)

通配符索引編制。

如果我理解正確,你想表達一個屬性s.t. - 在每種狀態下,只有從0index-1的存儲單元需要爲單調不遞減,其中index是一個可以更改值(任意?)的變量。

這種屬性的結構應該是:

ltl p1 { 
    [] (
     ((1 <= index) -> "... values[0] is monotonically non-decreasing ...") && 
     ((2 <= index) -> "... values[1] is monotonically non-decreasing ...") && 
     ((3 <= index) -> "... values[2] is monotonically non-decreasing ...") && 
     ... 
     ((N <= index) -> "... values[N-1] is monotonically non-decreasing ...") 
    ) 
} 

我相信回答你的問題是沒有。不過,我建議您使用作爲C預處理器以簡化屬性的編碼並避免一遍又一遍地寫同樣的東西。


注:

讓我們curr_intnext_int0-1整數變量S.T. next_int等於在下一個狀態(又名curr_intnext_int的前一個值)curr布爾變量s.t.中的值curr_intcurrtrue當且僅當curr_int等於1

然後,由LTL語義,X currtrue當且僅當curr_intnext_int是在下一(電流)狀態等於1

考慮以下真值表國有s_i

curr_int | next_int | curr_int <= next_int 

    0 |  0 |   1 
    0 |  1 |   1 
    1 |  0 |   0 
    1 |  1 |   1 

從上面的定義,我們可以把它改寫爲:

curr | X curr |   EXPR 

    false | false |   true 
    false | true |   true 
    true | false |   false 
    true | true |   true 

真值表這是可以可見EXPR對應於

!curr v (X curr) 

可以更優雅改寫爲

curr -> (X curr) 

釋是我們最後的LTL-encodeable版本的curr_int <= next_int對於給定的狀態s_i,當兩者都0-1整數變量

+0

這個答案很好。幾個問題/筆記。關於帖子的第一部分:因爲cur_value的最小值爲0,所以我試圖使用一個ltl公式,就像一個只在cur_value變成大於0之後聲明prev <= cur關係的鎖存器。但是,prev_value不是正在建模的系統,所以沒有什麼大不了的。最後一個問題是:ltl {prev <= cur}不起作用;它從未被侵犯過。我需要ltl {[] prev <= cur}。直覺我認爲[]會暗示。我在這裏瞭解到什麼?我將深入到tmrw問題的第二部分。 –

+0

@NoahWatkins在這種情況下將'prev'初始化爲'0'就足夠了。任何簡單的原子命題'P'只會檢查初始狀態's_0'。如果你想讓'P'在執行路徑中保持*每個狀態*,你可以寫'[] P',即*全局P *。如果你想讓'P'保持一些狀態集合'S',你可以編寫'[](state_is_in(S) - > P)',其中'state_is_in(S)'是一個原子命題,只有噹噹前狀態屬於給定的一組狀態'S'。 –

+0

要定義'S',您可以在* Promela *源代碼上使用*標籤引用*,或者直接寫入表達式來引用某些(或全部)變量的值。 如果你必須執行'prev