2013-03-05 23 views
5

Próbuję odtworzyć kod ALGOL 60 napisany przez Dijkstra w artykule zatytułowanym "Współpracujące procesy sekwencyjne", kod jest pierwszą próbą rozwiązania problemu z muteksem, tutaj jest składnia:Sprawdzanie modelu LTL za pomocą składni Spin i Promeli

begin integer turn; turn:= 1; 
     parbegin 
     process 1: begin Ll: if turn = 2 then goto Ll; 
          critical section 1; 
          turn:= 2; 
          remainder of cycle 1; goto L1 
       end; 
     process 2: begin L2: if turn = 1 then goto L2; 
          critical section 2; 
          turn:= 1; 
          remainder of cycle 2; goto L2 
        end 
     parend 
end 

Więc starałem się odtworzyć powyższy kod w Promela i tu jest mój kod:

#define true 1 
#define Aturn true 
#define Bturn false 

bool turn, status; 

active proctype A() 
{ 
    L1: (turn == 1); 
    status = Aturn; 
    goto L1; 
    /* critical section */ 
    turn = 1; 

} 

active proctype B() 
{ 
    L2: (turn == 2); 
    status = Bturn; 
    goto L2; 
    /* critical section */ 
    turn = 2; 
} 

never{ /* ![]p */ 
    if 
    :: (!status) -> skip 
    fi; 
} 

init 
{ turn = 1; 
    run A(); run B(); 
} 

Co staram się zrobić, to sprawdzić, czy nieruchomość uczciwość nie odbędzie, ponieważ etykiety L1 działa w nieskończoność.

Problem jest to, że mój nigdy zastrzeżenia blok nie wytwarza żadnego błędu, wyjście otrzymuję po prostu mówi, że moja wypowiedź nie została osiągnięta ..

tutaj jest rzeczywista moc z iSpin

spin -a dekker.pml 
gcc -DMEMLIM=1024 -O2 -DXUSAFE -DSAFETY -DNOCLAIM -w -o pan pan.c 
./pan -m10000 
Pid: 46025 

(Spin Version 6.2.3 -- 24 October 2012) 
    + Partial Order Reduction 

Full statespace search for: 
    never claim    - (not selected) 
    assertion violations + 
    cycle checks  - (disabled by -DSAFETY) 
    invalid end states + 

State-vector 44 byte, depth reached 8, errors: 0 
     11 states, stored 
     9 states, matched 
     20 transitions (= stored+matched) 
     0 atomic steps 
hash conflicts:   0 (resolved) 

Stats on memory usage (in Megabytes): 
    0.001 equivalent memory usage for states (stored*(State-vector + overhead)) 
    0.291 actual memory usage for states 
    128.000 memory used for hash table (-w24) 
    0.534 memory used for DFS stack (-m10000) 
    128.730 total actual memory usage 


unreached in proctype A 
    dekker.pml:13, state 4, "turn = 1" 
    dekker.pml:15, state 5, "-end-" 
    (2 of 5 states) 
unreached in proctype B 
    dekker.pml:20, state 2, "status = 0" 
    dekker.pml:23, state 4, "turn = 2" 
    dekker.pml:24, state 5, "-end-" 
    (3 of 5 states) 
unreached in claim never_0 
    dekker.pml:30, state 5, "-end-" 
    (1 of 5 states) 
unreached in init 
    (0 of 4 states) 

pan: elapsed time 0 seconds 
No errors found -- did you verify all claims? 

Przeczytałem całą dokumentację spinowania na bloku never{..}, ale nie mogłem znaleźć odpowiedzi (tutaj jest link), również próbowałem używać bloków ltl{..} (link), ale to właśnie dało mi błąd składni, nawet chociaż jest to wyraźnie wspomniane w dokumentacji, że c być na zewnątrz init i proctypes, czy ktoś może mi pomóc poprawić ten kod, proszę?

Dziękuję

+1

To jest programowanie, a nie nauka informatyki; wysyłając Cię do [SO]. – Raphael

Odpowiedz

1

pan nowo „true”, które nie mogą ewentualnie być dobre. Osiągnąłem kres tej redefinicji i nigdy nie zawiodłem. Ale porażka jest nieistotna dla twojego celu - ten początkowy stan "statusu" jest "fałszywy", a więc nigdy nie roszczeń wyjścia, co jest porażką.

Również, jest to trochę źle przypisywać 1 lub 0 do boolu; zamiast tego przypisz true lub false - lub użyj bit. Dlaczego nie stosować się do kodu Dijkstry bardziej - użyj "int" lub "byte". To nie jest tak, że wydajność będzie problemem w tym problemie.

Nie potrzebujesz "aktywnego", jeśli zamierzasz zadzwonić "uruchom" - tylko jeden lub drugi.

Moje tłumaczenie z '1' procesu byłoby:

proctype A() 
{ 
L1: turn !=2 -> 
    /* critical section */ 
    status = Aturn; 
    turn = 2 
    /* remainder of cycle 1 */ 
    goto L1; 
} 

ale mogę się mylić w tej sprawie.

+0

Dziękuję za twoją pomoc, czy mogę po prostu zapytać, co jest tutaj implikacją (->)? i dlaczego reguła blokowania jest tutaj uważana za złą, mam na myśli (true == 1); – ymg

+0

"->" oznacza dokładnie to samo co ";" ale jest stosowany stylistycznie po wyrażeniu blokującym. – GoZoner

+0

[Myślę, że chodziło ci o "(obróć == 1)"; nie prawda']. Nic złego w użyciu "turn == 1" lub "turn! = 2" - użyłem "turn! = 2", aby być analogicznym do kodu Dijkstry. – GoZoner