Question/Answer activity based on GraphoLearn graphical presentation and using SM2 algorithm
Open, Needs TriagePublic

Description

Creation of a learning activity based on Grapholearn graphical presentation.

http://grapholearn.fr/

The activity presents many solution to a single question, the user needs to select the correct one.
This can be used for many different learning cases:

  • letter according to its sound,
  • results of multiplication/addition tables,
  • chemical symbols vs full names
  • translated vocabulary
  • capital vs countries

etc etc

The activity needs to be configurable using the current multipledataset functionnality.

This activity has two concurrent modes:

  • Spaced repetition: used to consolidate already learned facts,

https://en.wikipedia.org/wiki/Spaced_repetition

  • Spaced learning: used to learned new facts

https://en.wikipedia.org/wiki/Spaced_learning

Spaced repetition is used using algorithm SM2 in the popular Anki program
Spaced learning is also using a slightly modified version of SM2.

They are both described in details in these two following links (in french so deepL will be helpful here)
https://linuxfr.org/users/anaseto/journaux/mes-peripeties-avec-la-repetition-espacee
https://linuxfr.org/users/anaseto/journaux/chronocram-memorisation-espacee-rapide-d-associations

You will need to install Morji and Chronogram to understand where we are aiming to.

We need to think about a clever way to go from the repetition mode to the learning mode, to allow pupils to train what they realise they do not know within playing the repetition mode.
We also need a "only repetition mode" to offer an evaluation mode to the teacher.

Here is an explanation of the algorithm SM2 which is used in both cases:

We are using cards to present the questions/answers.
The frequency to present the cards depends on the ability of the user to answer the questions.

Notation:
  card     the card to be revised now
  .rev     révision number (0 for non memorised or forgotten)
  .R        R card factor
  .DP       date for with the revision is due (if already memorised one time)
  .DA       date of the previous revision
  cards    cards database (json) (sorted by .DP)

GoodAnswer(card):
    D = actual date
    if  card.rev == 0: # first memorisation
        card.DP = D + 1-2 days
        card.DA = D
    si card.rev == 1: # particular case
        card.DP = D + 4-6 days
        card.DA = D
    else:
        I = D - card.DA # number of days since the last revision
                         
        card.DP = D + I*card.R*(1 ± 0.5%)
        card.DA = D
    card.rev += 1
    card.Actualising(card)

WrongAnswer(card):
    D = actual date
    if card.rev > 0:
        card.R -= 0.15 # could be modified
        if card.R < 1.3:
            card.R = 1.3 # less than 1.3 is not working anymore
        card.rev = 0
        card.DP = D
    card.Actualising(card)

AskQuestion():
    D = actual date
    L = card.GetBack({card or .DP <= D and .rev > 0})
    As long as L is not empty:
        For card in  L:
           display question
           get pupil answer
           if goodAnswer:
                goodAnswer(card)
           sinon:
                wrongAnswer(card)
        L = cartes.getBack({card forgotten with .rev == 0 and .DP <= D
            + limited number of new cards with .rev == 0 and without .DP})