[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tlaplus] Pluscal missing labels and TLA+ nested tuples errors



Hi,

I'm new to TLA+, so sorry for the maybe entry level questions. I'm trying to model a webrtc offer/answer exchange where both peers may send an offer at an arbitrary point in time.

1) I get an error at inb[0][0] in the definition of InboxOfferNoInc (which shall make sure that the offer numbers in the inbox are always increasing for the same type of message). Is it not possible to access nested tuples in that way or is where does the error come from?

2) I'm getting a lot of missing label errors (when trying to translate the PlusCal to TLA+ in the toolbox) at strange lines, e.g. at line 40 (peers[peer].offerNo := peers[peer].offerNo + 1;). My understanding of Pluscal is that whereever I put a label, I allow a switch between processes at this point, right? If that's correct, I do not want to put more labels in my code. Could somebody explain me (maybe at the example of l. 40) why there need to be additional labels?

Code:

-------------------------------- MODULE offeranswer --------------------------------

EXTENDS Naturals, TLC

THEOREM makingOffer == \A p \in 1..2: ~peers[p].makingOffer ~> peers[p].makingOffer
THEOREM sendingAnswer == \A p \in 1..2: ~peers[p].sendingAnswer ~> peers[p].sendingAnswer
InboxOfferNoInc(inb) == \A e \in Tail(inb): inb[0][0] == e[0] -> e[1] > inb[0][1]
THEOREM inboxOffer == \A p \in 1..2: Len(inbox[p]) < 2 \/ InboxOfferNoInc(inbox[p])

(* --algorithm offeranswer
variables peers = [ peer \in 1..2 |-> [ makingOffer |-> FALSE, pendingOffer |-> NULL, sendingAnswer |-> FALSE, offerNo |-> 1 ] ],
          inbox = [ peer \in 1..2 |-> <<<>>> ],
          localDesc = [ peer \in 1..2 |-> <<<0, 0>>> ],
          remoteDesc = [ peer \in 1..2 |-> <<<0, 0>>> ],
          lastAccepted = [ peer \in 1..2 |-> 0 ],
          offerPeer = 1;

macro pop(queue, element) begin
  await queue /= <<<>>>;
  element := Head(queue);
  queue := Tail(queue);
end macro;

macro send(sender, type, val) begin
  inbox[(sender + 1) % 2] := Append(inbox[(sender + 1) % 2], <<<type, val>>>)
end macro;

macro setDesc(queue, peer, offerNo) begin
  queue := <<<peer, offerNo>>>;
  assert offerNo > lastAccepted[peer]
end macro;

procedure sendOffer(peer) begin
  SendOffer:
    if ~peers[peer].makingOffer then
      peers[peer].makingOffer := TRUE;
  AfterCreateOffer:
      peers[peer].pendingOffer := peers[peer].offerNo;
      send(peer, "offer", peers[peer].offerNo);
      peers[peer].offerNo := peers[peer].offerNo + 1;
    end if;
    return;
end procedure;

procedure receiveOffer(peer, offerNo) begin
  ReceiveOffer:
      if peers[peer].makingOffer /\ peer = offerPeer then return; end if;
      if peers[peer].sendingAnswer then return; end if;
      peers[peer].pendingOffer := NULL;
      peers[peer].makingOffer := FALSE;
      peers[peer].sendingAnswer := FALSE;
  SetRemoteDescOnOffer:
      setDesc(remoteDesc[peer], (peer + 1) % 2, offerNo);
      call sendAnswer(peer, offerNo);
      return;
end procedure;

procedure sendAnswer(peer, offerNo) begin
  SendAnswer:
    setDesc(localDesc[peer], (peer + 1) % 2, offerNo);
    send(peer, "answer", offerNo);
    peers[peer].sendingAnswer := FALSE;
    return;
end procedure;

procedure receiveAnswer(peer, offerNo) begin
  ReceiveAnswer:
    setDesc(localDesc[peer], peer, offerNo);
  SetRemoteDescOnAnswer:
    setDesc(localDesc[peer], peer, offerNo);
    lastAccepted[peer] := offerNo;
    return;
end procedure;

process peer \in 1..2
variables message = NULL
begin P:
  while True do
    either
      call sendOffer(peer);
    or
      pop(inbox[peer], message);
      if message[0] = "offer" then
        call receiveOffer(peer, message[1]);
      else
        call receiveAnswer(peer, message[1]);
      end if;
    end either;
  end while;
end process;

end algorithm; *)

=======================================================================

Thanks in advance!

--
You received this message because you are subscribed to the Google Groups "tlaplus" group.
To unsubscribe from this group and stop receiving emails from it, send an email to tlaplus+unsubscribe@xxxxxxxxxxxxxxxx.
To view this discussion on the web visit https://groups.google.com/d/msgid/tlaplus/d20f4ef0-19c2-474c-b969-f0ebff2c2910n%40googlegroups.com.