• Aucun résultat trouvé

7.2 Hypermédia adaptatif pédagogique

7.2.2 Programme de base

πa.¬shown(a)?;display(a);markShown(a);askLiked(a)). (7.12) Les articles remplissant au moins une condition du profil sont préférés. Le processus de transforma-tion n’est qu’une possibilité, et il serait possible de définir des variantes du processus de transformatransforma-tion pour obtenir d’autres résultats, plus appropriés. Par exemple, en cas de conditions préférées multiples, on pourrait préférer l’article qui en satisfait le plus grand nombre.

7.2 Hypermédia adaptatif pédagogique

Dans cette section, nous présentons un scénario d’hypermédia adaptatif pédagogique, inspiré d’un scénario similaire [Jac06]. Dans ce scénario, l’application accompagne un utilisateur à travers l’apprentissage d’un cours.

7.2.1 Description

L’application permet à l’utilisateur de choisir l’ordre dans lequel il souhaite apprendre les différents éléments du cours, tout en fournissant des bornes pour que l’ordre de parcours du cours reste cohérent. Pour chaque partie du cours choisie, l’application présente à l’utilisateur des ressources qui peuvent être des définitions, des explications, des exemples, ou des exercices. Une fois que suffisamment de ressources ont été vues, ou qu’un exercice validant la partie a été réussi, l’application permet à l’utilisateur de choisir une autre partie.

Il se peut qu’un utilisateur survole une ressource plutôt que de la lire. Cela peut se produire si l’utilisateur devient impatient parce que le cours est trop simple, ou parce que la session est trop longue. L’application est capable de détecter quand cela se produit, et présente un exercice pour savoir si l’utilisateur a compris et s’impatiente, ou est simplement las. Si l’exercice est réussi, la partie est validée et l’application continue, sinon, l’application propose à l’utilisateur de faire une pause.

Pour permettre à l’utilisateur de parcourir le cours comme il le souhaite, le cours est constitué d’un graphe de concept ayant des relations de prérequis. Chaque concept comporte des ressources, qui sont les documents concrets à montrer à l’utilisateur. Le cours est composé par une équipe pédagogique sensibilisée à la composition de cours non linéaires.

7.2.2 Programme de base

La modélisation du domaine est la suivante. Le terme concept(c) indique que c est un concept du cours. Le terme prereq(c, c0) indique que c est un prérequis de c0, et doit être appris avant. Les termes definition(r ), explaination(r ), example(r ) et exercice(r ) indique que r est une ressource : respective-ment une définition, une explication, un exemple ou un exercice. Le prédicat about(r, c) indique que la ressource r concerne le concept c.

En dehors du modèle logique, chaque concept dispose d’un nom d’affichage et chaque ressource d’un contenu que l’intermédiaire peut afficher. La réalisation des exercices est prise en charge par l’intermédiaire qui signale simplement à l’agent si l’exercice a été réussi. L’application comporte quatre pages :

— Une page permettant d’afficher une liste de concept. L’agent envoie une liste de concepts avec des priorités, et l’intermédiaire renvoie le choix de l’utilisateur. Les priorités permettent de guider l’utilisateur tout en lui laissant un choix large, et amènent des affichages différents (mis en valeur, normal, estompé).

— Une page permet d’afficher une définition, une explication ou un exemple. L’intermédiaire informe l’agent si l’utilisateur a sauté la ressource plutôt que de la lire.

— Une page permet d’afficher un exercice. L’intermédiaire envoie le résultat à l’agent quand l’exercice est terminé.

— Une page suggérant à l’utilisateur de faire une pause. L’intermédiaire rend la main à l’agent une fois que la pause est terminée.

La définition de l’intermédiaire correspondante est la suivante : [〈showConcepts(list),conceptsPage,[askConcept]〉,

〈showResource(r ), resourcePage, [askSkipped]〉, 〈showExercice(r ), exercicePage, [askResult]〉,

〈suggestPause, suggestPausePage, [waitDuringPause]〉]. (7.13) L’agent dispose d’un fluent seen(resource) permettant de savoir si l’utilisateur a déjà vu des res-sources. L’action markSeen(resource) permet de modifier ce fluent. Les définitions sont triviales (simi-laires à shown et markShown du scénario précédent).

Le niveau de connaissance d’un concept est représenté par un nombre entre 0 et 1. Il augmente à chaque ressource lue et à chaque exercice réussi. Le fluent level(concept) contient ce niveau, et incrLevel(concept, value) l’incrémente. Le concept est considéré comme connu (learned(concept)) si le niveau de connaissance est 1.

Poss(incrLevel(concept, value)) ≡ concept(concept) ∧ number(value) (7.14) level(concept, do(a, s)) = l ≡ a = incrLevel(concept,value) ∧ l = max(level(concept, s) + value, 1) ∨ a 6= incrLevel(concept, _) ∧ l = level(concept, s) (7.15) ∀c concept(c) =⇒ level(c, s0) = 0 (7.16) learned(concept, s) ≡ level(concept, s) = 1 (7.17) Pour construire la liste des concepts, l’agent dispose d’un fluent fonctionnel concepts qui a pour valeur une liste de paires concepts priorités. Les priorités possibles sont high, medium et low. L’agent peut manipuler ce fluent avec les actions clearConcepts, addHigh(concept), addMedium(concept) et addLow(concept). Leurs définitions sont les suivantes :

Poss(addHigh(c), s) ≡ Poss(addMedium(c), s) ≡ Poss(addLow(c), s) ≡ concept(c) ∧ ¬∃p (c, p) ∈ concepts(s), (7.19) concepts(do(a, s)) = v ≡ v0= concepts(s) ∧ [ a = addHigh(c) ∧ v = v0+ 〈c, high〉 ∨ a = addMedium(c) ∧ v = v0+ 〈c, medium〉 ∨ a = addLow(c) ∧ v = v0+ 〈c, low〉

∨ a 6= addHigh(_) ∧ a 6= addMedium(_) ∧ a 6= addLow(_) ∧ v = v0. (7.20) Le programme de l’agent est structuré en plusieurs procédures. Les principales procédures sont makeConceptsList, qui crée la liste de concepts à envoyer à l’utilisateur, et handle(concept) qui fait tout ce qui est nécessaire pour enseigner concept à l’utilisateur. Le programme principal est :

clearConcepts; makeConceptsList; sendConcepts(concepts);

askConcept; handle(result(askConcept)). (7.21) La procédure makeConceptsList parcourt tous les concepts qui ne sont pas encore connus de l’utilisateur et les ajoute à la liste avec la priorité moyenne si tous les prérequis sont connus et la priorité basse si ce n’est pas le cas. Le fluent ready(concept) permet de savoir si tous les prérequis sont connus.

ready(c, s) ≡ ∀c0prereq(c0, c) =⇒ learned(c0, s) (7.22)

proc makeConceptsList

while ∃c ¬learned(c) ∧ ¬c ∈ concepts

πc ¬learned(c)?; if ready(c) addMedium(c) else addLow(c) endIf endWhile endProc (7.23)

La procédure handle(concept) choisit des ressources et les affiche jusqu’à ce que le concept soit connu.

proc handle(concept) while ¬known(resource)

doπconcept about(resource,concept) ∧ ¬seen(resource)?;present(resource)

La procédure present(resource) appelle simplement presentExercice ou presentOther en fonction du type de la ressource.

proc present(r )

if example(r ) then presentExercice(r ) else presentOther(r ) endIf

endProc (7.25)

La procédure presentExercice envoie un exercice à l’utilisateur. Si l’exercice est réussi, il est marqué comme seen pour ne plus être affiché, et le niveau d’apprentissage du concept est mis à jour.

proc presentExercice(e)

showExercice(e); askResult;

if result(askResult) then markSeen(e); updateKnowledge(e) else endIf

endProc (7.26)

La procédure updateKnowledge(resource) met à jour le niveau de connaissance pour le concept de resource.

proc updateKnowledge(r )

πc about(r,c)?;incrLevel(c,0.25)

endProc (7.27)

La procédure presentOther(resource) présente une ressource puis met à jour le niveau de connais-sance. Si l’utilisateur n’a pas lu la ressource, alors un exercice est proposé pour déterminer si le concept est connu, ou si l’utilisateur est juste lassé.

proc presentOther(r ) showResource(r ); askSkipped; if result(askSkipped) then πc about(r,c)?;boredomExercice(c) else markSeen(r ); updateKnowledge(r ) endIf endProc (7.28)

Enfin, la procédure boredomExercice(concept), déclenchée quand l’utilisateur saute une ressource sans la lire, propose un exercice : si l’exercice est réussi, le concept est considéré connu, sinon, on

propose à l’utilisateur de faire une pause. proc boredomExercice(c) πr about(r,c); showExercice(e); askResult; if result(askResult) then markSeen(e); incrLevel(c, 1) else suggestPause; waitDuringPause endIf endProc (7.29)