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

Re: [tlaplus] How to choose a record field when a record is an element of a set?



On 11.11.2015 18:50, Y2i wrote:
> Looking for a practical advice...
> 
> Let's assume I'm reading a record by its ID.  There is at most one record 
> with such an ID.
> 
> TypeInvariant == \A d \in data : Cardinality({x \in data : x.id = d.id}) = 1
> 
> 
> If such record exists, I need to return its *d* field.  I currently use 
> CHOOSE to select such a record:
> 
> 
> R(r) == CHOOSE x \in r : TRUE
> 
> 
> Read(r) ==
> 
>     /\ r.op = "R"
> 
>     /\ LET d == {x \in data : x.id = r.id}
> 
>        IN  IF d = {} THEN
> 
>                qout' = Append(qout, [code|->"ERR"])
> 
>            ELSE
> 
>                qout' = Append(qout, [code|->"OK", d|->R(r).d])
> 
>     /\ UNCHANGED <<data>>
> 
> 
> Is there a  better way to achieve this?

I recently had similar questions and found no better way to do it than
what you just demonstrated. In the end, I found that converting the sets
to records with the ID as the domain was a better overall solution for
me. To check whether an element with the ID in is in the record, one
just has to check (id \in DOMAIN theSet), and use theSet[id] to retrieve
it. This looks a lot nicer when written in TLA+, but I'm not sure how it
affects TLC/TLAPS performance.

Best regards,
Jaak