[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 12 Nov 2015, at 09:25, Jaak Ristioja <jaak.r...@xxxxxxxx> wrote:
>
> 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.
That's indeed the canonical TLA+ idiom: represent functional dependency by functions.
Stephan