1
我有相當simpe發送器 - 接收協議:SPIN驗證:不能證明LTL式
#define SZ 4
int sent = 0;
int received = 0;
chan ch = [SZ] of {int};
int varch;
init {
do
:: ((len(ch) < SZ) && (received != 1)) ->
d_step {
ch ! 1; sent = 1; printf("sent\n");
}
:: ((len(ch) == SZ) || ((received == 1) && (len(ch) > 0))) ->
d_step {
ch ? varch; received = 1; printf("received\n");
}
:: 1 -> /* simulates ramdomness */
atomic {
printf("timeout1\n");/*break; */
}
od;
}
它發送四個包,然後接收它們。然後我試圖證明屬性:總是發送意味着最終得到:
零擔PR {[((發送== 1) - >(<>(收到== 1)))}
...什麼也沒有發生:SPIN沒有找到這個屬性證明和它的否定。
爲什麼?
哦,現在你顯示週期後,我看到了問題。但是用'./pan -a -i'搜索呢?有自旋報告:線索結束8步驟 #processes後:1 \t \t發送= 1 \t \t接收= 0 \t \t隊列1(CH):[1] [1] \t \t varch = 0 8: \t proc 0(:init :: 1)test.pml:11(state 14) 8:\t proc - (pr:1)_spin_nvr.tmp:7(state 10) 這是不明顯的correctess問題是無限的「超時「在這裏執行 – runov 2014-11-11 16:04:39
查看邏輯含義的真值表(http://bit.ly/10VPzlJ)。 'p'爲'false'時'p-> q'爲'true'。這是SPIN發現的。你的'q'表達式需要改變成'p && <> q'(但是通過關於放置'<>'來思考)。 – GoZoner 2014-11-11 18:21:30