HaloO,

Audrey Tang wrote:
> A variant's score cards only records two Boolean values for each 
> variant: "voting" and "qualified".

Here is a summary of the explanation Audrey gave me on #perl6.
Note that this is from memory because I didn't save the log.
In particular I don't remember exactly where the intersection
of QS and VS was taken. But I hope I understood the algorithm.
So, correct me if there is a mistake below.

The following assumes a call with

  \($fido,$fido) # (Dog,Dog)

to two multi targets M1 and M2. For each target two sets of
methods are maintained: QS (Qualified Set) and VS (Voting Set).
The numbers indicate the values after the evaluation of the
argument positions. Step 0 is the applicability test. When the
sets are the same for M1 and M2 they are listed only once.

  :(Dog, Animal) # M1
  :(Animal, Dog) # M2
                                
  0:  QS={M1,M2}  VS={M1,M2}
  1:  QS={M1}     VS={M1,M2}
  2:  QS={}       VS={M1,M2}

Result is ambiguity because of the empty QS.


  :(Dog; Animal) # M1
  :(Animal; Dog) # M2

  0:  QS={M1,M2}  VS={M1,M2}
  1:  QS={M1}     VS={M1,M2}
  2:  QS={M1}     VS={M1}

M1 is chosen. Both VS are reduced by M2 which is
already disqualified. That is the new VS is the
intersection of the old VS and QS.


  :(Dog; Animal) # M1
  :(Animal, Dog) # M2

  0:  QS={M1,M2}  VS={M1,M2}
  1:  QS={M1}     VS={M1,M2}
  2:  QS1={M1}    VS1={M1}
      QS2={}      VS2={M1,M2}

Single semicolon is local action on VS of M1.
Result is ambiguity because of non-consensus.


  :(Dog, Animal) # M1
  :(Animal; Dog) # M2

  0:  QS={M1,M2}  VS={M1,M2}
  1:  QS={M1}     VS={M1,M2}
  2:  QS1={}      VS1={M1,M2}
      QS2={M1}    VS2={M1}

Result is ambiguity because of non-consensus.


  :(Dog;; Animal) # M1
  :(Animal, Dog)  # M2

  0: QS={M1,M2} VS={M1,M2}
  1: QS={M1}    VS={M1,M2}
  2: QS={}      VS={M2}

Double semicolon is a global operation to take M1 out of
all VS, hence no case distinction. The remaining M2 in VS
of step 2 disqualifies M1 and we end up with ambiguity.


  :(Dog, Animal)  # M1
  :(Animal;; Dog) # M2

  0: QS={M1,M2} VS={M1,M2}
  1: QS={M1}    VS={M1,M2}
  2: QS={M1}    VS={M1}

This dispatches to M1.

Note that the purpose of the VS is to disqualify other
methods. Only the methods in QS remain contenders.


Regards, TSa.
-- 

Reply via email to