Hello,
imagine a kid playing famous minesweeper, but not directly, only troughout a "robot" he's programming.
For example, giving the robot the rule "if a 1 has only one hidden square and no mine among its 8-neighbours then there is a mine under the hidden square", then the robot fires this rule as far as possible and then stops.
The kid can only add new rules, which are immediatly effective; when the robot cannot fire any rule, the kid has to give (discover) a new one.
Anybody knows something like that or is able to write it in squeak?
Tu es sur la liste squeak en français, tu peux donc parler en français ;-)
2008/3/17, kevin kevin.rowanet@wanadoo.fr:
Hello,
imagine a kid playing famous minesweeper, but not directly, only troughout a "robot" he's programming.
For example, giving the robot the rule "if a 1 has only one hidden square and no mine among its 8-neighbours then there is a mine under the hidden square", then the robot fires this rule as far as possible and then stops.
The kid can only add new rules, which are immediatly effective; when the robot cannot fire any rule, the kid has to give (discover) a new one.
Anybody knows something like that or is able to write it in squeak?
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
Bonjour Kevin,
C'est intéressant. Qu'est-ce que tu proposes comme solution pour la résolution des conflits entre règles ? La plus ancienne (ou récente) gagne ? Toutes les règles applicables sont mises en oeuvre ?
Noury On 17 mars 08, at 21:03, kevin wrote:
Hello,
imagine a kid playing famous minesweeper, but not directly, only troughout a "robot" he's programming.
For example, giving the robot the rule "if a 1 has only one hidden square and no mine among its 8-neighbours then there is a mine under the hidden square", then the robot fires this rule as far as possible and then stops.
The kid can only add new rules, which are immediatly effective; when the robot cannot fire any rule, the kid has to give (discover) a new one.
Anybody knows something like that or is able to write it in squeak?
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
Noury Bouraqadi ------------------------------------------------------------------ Dr. Noury Bouraqadi - Enseignant/Chercheur Responsable de l'enseignement de l'informatique ARMINES - Ecole des Mines de Douai - Dept. I.A. http://vst.ensm-douai.fr/noury
European Smalltalk Users Group Board http://www.esug.org ------------------------------------------------------------------
Bonjour,
Noury Bouraqadi a écrit :
C'est intéressant.
merci.
Qu'est-ce que tu proposes comme solution pour la résolution des conflits entre règles ? La plus ancienne (ou récente) gagne ?
La plus ancienne, pour commencer.
L'idée serait que la règle de résolution de conflit (meta règle ?) soit d'abord figée, puis que lorsque les enfants commencent à s'intéresser à l'ordre d'application des règles, ils puissent agir.
Toutes les règles applicables sont mises en oeuvre ?
Je ne comprends pas la question, s'il ne s'agit pas de résoudre des conflits : si on suppose qu'on conserve comme objectif de "gagner", quel est l'intérêt de ne pas appliquer une règle applicable ?
**
Est-ce que squeak permettrait de programmer des règles en s'affranchissant d'une formulation écrite ? à la etoys ?
On 18 mars 08, at 13:22, kevin wrote:
Toutes les règles applicables sont mises en oeuvre ?
Je ne comprends pas la question, s'il ne s'agit pas de résoudre des conflits : si on suppose qu'on conserve comme objectif de "gagner", quel est l'intérêt de ne pas appliquer une règle applicable ?
C'était au cas où plusieurs règles sont applicable au même moment. Si on n'applique qu'une seul, la situation change. Je ne sais pas si on peut arriver à une situation de blocage => donc besoin de nouvelles règles. Et plus il y a de règles, plus c'est complexe => source de problèmes peut-être ?
Noury
**
Est-ce que squeak permettrait de programmer des règles en s'affranchissant d'une formulation écrite ? à la etoys ?
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
Noury Bouraqadi ------------------------------------------------------------------ Dr. Noury Bouraqadi - Enseignant/Chercheur Responsable de l'enseignement de l'informatique ARMINES - Ecole des Mines de Douai - Dept. I.A. http://vst.ensm-douai.fr/noury
European Smalltalk Users Group Board http://www.esug.org ------------------------------------------------------------------
Bonjour, J'ai une peu creusé la question:
Pour piloter le jeu par le robot 2 solutions.
Utiliser le démineur de Squeak et faire des scripts servant d'interface pour commander le jeu.
Créer d'abord un démineur en Squeak écrit avec E-toys (ou V-toys).
La seconde solution offre plus de liberté. Entre autre on peut poursuivre après l'explosion d'une mine ce qui gagne du temps pour explorer le jeu.
Les règles déterminant si un case a une mine ou non. Leur ordre n'a aucune importance simplement on marque la mine ou on clique sur la case pour obtenir une nouvelle information.
Il y a 2 types de règles:
Les règles logiques qui donne une certitude.
Les règles donnant des probabilités de présence d'une mine.
Il faut appliquer les certitudes, l'ordre n' a pas d'importance.
En suite jouer les plus faibles probabilités de présence, si l'on tombe sur une mine le jeu se termine :-).
Les règles peuvent s'écrire sous forme de scripts E-toys.
Des scripts outils devraient faciliter l'écriture des règles.
Une des fonctions outils de base est l'exploration des cases entourant une case particulière.
Ce script existe déjà dans le jeu pour compter les bombes touchant une case. Pour marquer une case appuyer sur 'm' avant de cliquer sur la case.
La version pour l'image OLPC du demineur en Etoy
http://swiki.ofset.org:8000/super/326
Version pour l'image squeakland (qui se charge aussi dans 3.9 mais ne se sauve plus :-).
http://swiki.ofset.org:8000/super/327
Une version utilisant un idiome Etoy pour chercher les cases contigües et avec quelques règles est en préparation Je vais faire une page sur ofset o?u l'on poura échanger nos propositions de résolutions.
Amitiés
-------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Noury Bouraqadi Date: mar. 18/03/2008 14:50 À: Squeak in french / Squeak en français Objet : Re: [Squeak-fr] minesweeper and rules system
On 18 mars 08, at 13:22, kevin wrote:
Toutes les règles applicables sont mises en oeuvre ?
Je ne comprends pas la question, s'il ne s'agit pas de résoudre des conflits : si on suppose qu'on conserve comme objectif de "gagner", quel est l'intérêt de ne pas appliquer une règle applicable ?
C'était au cas où plusieurs règles sont applicable au même moment. Si on n'applique qu'une seul, la situation change. Je ne sais pas si on peut arriver à une situation de blocage => donc besoin de nouvelles règles. Et plus il y a de règles, plus c'est complexe => source de problèmes peut-être ?
Noury
**
Est-ce que squeak permettrait de programmer des règles en s'affranchissant d'une formulation écrite ? à la etoys ?
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
Noury Bouraqadi ------------------------------------------------------------------ Dr. Noury Bouraqadi - Enseignant/Chercheur Responsable de l'enseignement de l'informatique ARMINES - Ecole des Mines de Douai - Dept. I.A. http://vst.ensm-douai.fr/noury
European Smalltalk Users Group Board http://www.esug.org ------------------------------------------------------------------
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
Bonjour, Celà relance le problème de disposer d'un prolog fonctionnant en Squeak. J'avais vu dans une discussion une promesse de mise à jour mais 'si rien vu venir.
La dernière version où prolog marche est squeak 3.6. Dans 3.7 celà semble marcher mais à la première erreur tout plante et Sqeak se bloque.
La proposition est intéressante.
Si l'on est pas trop pressé on peut essayer avec shelog, un prolog en scheme pour Squeak mais la syntaxe est peinible.
Je vais explorer le sujet ...
J'ai autrefois fait avec mes élèves le jeu du morpion sous forme de règles. pour que celà soit faisable, il faut donner un système d'écriture et d'interprétation de règles convivial.
-------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de kevin Date: mar. 18/03/2008 13:22 À: Squeak in french / Squeak en français Objet : Re: [Squeak-fr] minesweeper and rules system
Bonjour,
Noury Bouraqadi a écrit :
C'est intéressant.
merci.
Qu'est-ce que tu proposes comme solution pour la résolution des conflits entre règles ? La plus ancienne (ou récente) gagne ?
La plus ancienne, pour commencer.
L'idée serait que la règle de résolution de conflit (meta règle ?) soit d'abord figée, puis que lorsque les enfants commencent à s'intéresser à l'ordre d'application des règles, ils puissent agir.
Toutes les règles applicables sont mises en oeuvre ?
Je ne comprends pas la question, s'il ne s'agit pas de résoudre des conflits : si on suppose qu'on conserve comme objectif de "gagner", quel est l'intérêt de ne pas appliquer une règle applicable ?
**
Est-ce que squeak permettrait de programmer des règles en s'affranchissant d'une formulation écrite ? à la etoys ?
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
salut à tous,
je réponds ici à un message de mars dernier:
Dreyfuss Pierre-André (EDU) a écrit :
Bonjour, Celà relance le problème de disposer d'un prolog fonctionnant en Squeak. J'avais vu dans une discussion une promesse de mise à jour mais 'si rien vu venir.
La dernière version où prolog marche est squeak 3.6. Dans 3.7 celà semble marcher mais à la première erreur tout plante et Sqeak se bloque.
en fichier joint, vous trouverez de quoi installer Prolog dans une image récente (j'ai testé 3.8, 3.9 et 3.10)
usage: pour 3.9 et 3.10, chargez d'abord le changeset PreFixes (pour 3.8 c'est inutile), puis balancez le Prolog 13Dec1628, et enfin le PostFixes.
le PostFixes s'occupe de remplacer les tests en "class == Symbol" par "isSymbol", nécessaire depuis l'introduction de ByteSymbol (ce qui ne nous rajeunit pas). Le PreFixes bidoulle dans le Parser, mais rien de grave ne vous inquiétez pas... il copie deux méthodes de 3.8 qui ont disparu en 3.9 pour cause de pragmas ou un truc du genre.
après vous pouvez faire "PrologWorkspace openDemoFamily" et évaluer les deux expressions. ça marche. je n'ai pas testé plus loin...
Stef
... et voici une version un poil plus récente, la dernière sur SqueakMap: http://map.squeak.org/package/cb6c7afe-d517-470f-8857-d764ef321725/autoversi...
incluant les corrections décrites dans mon dernier message
Stef
Salut et merci ;)
Je cherchais justement à utiliser Prolog.
Par contre j'ai un petit souci, sur les dernieres 3.10web de Damien, le chargement se passe bien. Par contre, je ne peux plus sauvegarder l'image (ecran figé). De meme les fenetre de type debugger ne peuvent être fermées.
Cédrick
2008/6/8 Stéphane Rollandin hepta@zogotounga.net:
... et voici une version un poil plus récente, la dernière sur SqueakMap: http://map.squeak.org/package/cb6c7afe-d517-470f-8857-d764ef321725/autoversi...
incluant les corrections décrites dans mon dernier message
Stef
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
en fait il doit y avoir un problème avec le "source" des exemples en Prolog... Quand je demande d'afficher par exemple Doctor>>healthHistory: j'ai un subscript out of bound. Ca ne vient pas d'OB puisque j'ai le même problème avec les package browser.
8 June 2008 12:15:58 pm
VM: Win32 - a SmalltalkImage Image: Squeak3.10.1 [latest update: #7175]
Array(Object)>>error: Receiver: #() Arguments and temporary variables: aString: 'subscript is out of bounds: 1' Receiver's instance variables: #()
Array(Object)>>errorSubscriptBounds: Receiver: #() Arguments and temporary variables: index: 1 Receiver's instance variables: #()
Array(Object)>>at: Receiver: #() Arguments and temporary variables: index: 1 Receiver's instance variables: #()
Array(SequenceableCollection)>>replaceFrom:to:with:startingAt: Receiver: #(nil) Arguments and temporary variables: start: 1 stop: 1 replacement: #() repStart: 1 index: 1 repOff: 0 Receiver's instance variables: #(nil)
--- The full stack --- Array(Object)>>error: Array(Object)>>errorSubscriptBounds: Array(Object)>>at: Array(SequenceableCollection)>>replaceFrom:to:with:startingAt: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Array>>replaceFrom:to:with:startingAt: Array(SequenceableCollection)>>copyFrom:to: CompiledMethod>>replace:with:in: CompiledMethod>>getSourceFor:in: Doctor class(Behavior)>>sourceCodeAt:ifAbsent: OBMethodNode>>source OBMethodNode>>definition OBMethodNode(OBCodeNode)>>getDefinition OBEnhancementDefinitionPanel>>selectionChanged: MessageSend>>valueWithArguments: [] in ActionSequence>>valueWithArguments: {[:each | answer := each valueWithArguments: anArray]} ActionSequence(SequenceableCollection)>>do: ActionSequence>>valueWithArguments: [] in OBAnnouncer>>announce: {[:class :action | (ann isKindOf: class) ifTrue: [action valueWithArgum...]} [] in IdentityDictionary(Dictionary)>>keysAndValuesDo: {[:assoc | aBlock value: assoc key value: assoc value]} IdentityDictionary(Set)>>do: IdentityDictionary(Dictionary)>>associationsDo: IdentityDictionary(Dictionary)>>keysAndValuesDo: OBAnnouncer>>announce: OBEnhancementColumn(OBColumn)>>signalSelectionChanged OBEnhancementColumn>>signalSelectionChanged OBEnhancementColumn(OBColumn)>>selection: OBEnhancementColumn>>selection: OBPluggableListMorph(PluggableListMorph)>>changeModelSelection: OBPluggableListMorph>>mouseUp: OBPluggableListMorph(Morph)>>handleMouseUp: MouseButtonEvent>>sentTo: OBPluggableListMorph(Morph)>>handleEvent: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>dispatchEvent:with: OBPluggableListMorph(Morph)>>processEvent:using: OBPluggableListMorph(Morph)>>processEvent: OBPluggableListMorph(PluggableListMorph)>>handleFocusEvent: [] in HandMorph>>sendFocusEvent:to:clear: {[ActiveHand := self. ActiveEvent := anEvent. result := focusHolder han...]} [] in PasteUpMorph>>becomeActiveDuring: {[aBlock value]} BlockContext>>on:do: PasteUpMorph>>becomeActiveDuring: HandMorph>>sendFocusEvent:to:clear: HandMorph>>sendEvent:focus:clear: HandMorph>>sendMouseEvent: HandMorph>>handleEvent: HandMorph>>processEvents [] in WorldState>>doOneCycleNowFor: {[:h | ActiveHand := h. h processEvents. capturingGesture := capturingGest...]} Array(SequenceableCollection)>>do: WorldState>>handsDo: WorldState>>doOneCycleNowFor: WorldState>>doOneCycleFor: PasteUpMorph>>doOneCycle [] in Project class>>spawnNewProcess {[[World doOneCycle. Processor yield. false] whileFalse. nil]} [] in BlockContext>>newProcess {[self value. Processor terminateActive]}
cdrick a écrit :
en fait il doit y avoir un problème avec le "source" des exemples en Prolog... Quand je demande d'afficher par exemple Doctor>>healthHistory: j'ai un subscript out of bound.
en revanche ça marche dans une image 3.8
ce genre de problème n'est pas très étonnant vu que le format des méthodes prolog est sensiblement différent de Smalltalk. je pense qu'il faudrait revoir l'implémentation du LParser et ne plus définir les clauses dans des pseudo-méthodes qui ne sont pas du Smalltalk.
je vais voir si je ne peux pas utiliser le genre d'astuces qui m'ont réussi avec LispKit pour revoir ce Prolog. au fait, quelqu'un a-t-il sous la main la documentation pointée par http://map.squeak.org/package/cb6c7afe-d517-470f-8857-d764ef321725/default
et qui devrait ce trouver là: http://bolot.net/squeak/prolog/v-prolog.pdf
?
bolot.net ne répond pas et google ne donne aucune autre adresse...
Stef
en revanche ça marche dans une image 3.8
ce genre de problème n'est pas très étonnant vu que le format des méthodes prolog est sensiblement différent de Smalltalk. je pense qu'il faudrait revoir l'implémentation du LParser et ne plus définir les clauses dans des pseudo-méthodes qui ne sont pas du Smalltalk.
je vais voir si je ne peux pas utiliser le genre d'astuces qui m'ont réussi avec LispKit pour revoir ce Prolog.
ok, cool. Au fait tu ne viens pas au RMLL par hasard ?
au fait, quelqu'un a-t-il sous la main la documentation pointée par http://map.squeak.org/package/cb6c7afe-d517-470f-8857-d764ef321725/default
J'adore archive.org :) http://web.archive.org/web/*/http://bolot.net/squeak/prolog/v-prolog.pdf
Il cible le pdf mais le cache de google n'existe plus par contre ca donne une version html http://www.pdfdownload.org/pdf2html/pdf2html.php?url=http%3A%2F%2Fweb.archiv...
Je joins le fichier html généré car je ne sais pas si j'ai pu le récuperer grace a un plugin firefox... bon c'est un peu en vrac mais ca se lit...
A plus,
Cédrick
Le fichier est pas bon... celui la devrait etre mieux... ;)
@ plus
Cédrick
dans le document, ca parle de LogicBrowser, il n'y en a pas dans l'implémentation actuelle ? J'imagine que LParser et LCompiler sont censés permettre d'utiliser une browser classique... ?
cdrick a écrit :
dans le document, ca parle de LogicBrowser, il n'y en a pas dans l'implémentation actuelle ? J'imagine que LParser et LCompiler sont censés permettre d'utiliser une browser classique... ?
à l'origine sans doute mais visiblement ce n'est plus le cas...
Stef
Bonjour.
On utilise un browser normaL pour écrire des clauses Prolog.
Le Lparser détecte au format de la méthode s'il sagit d'une méthode smalltalk ou de la syntaxe prolog.
La syntaxe prolog est très proche d'un prolog standard La principale différence est l'usage de minuscules pour les variables alors qu'un prolog standard utilise ds majuscules, ceci pour respecter les règles de smalltalk.
Le code "pseudo smalltalk" est en fait réellement du code smalltalk car le parseur convertit la méthode écrite en prolog en la méthode smalltalk qui fait le travail dans l'environnement smalltalk. Mais l'utilisateur n'a à voir que le code prolog dans le browser, le but étant d'utiliser et de penser en prolog tout en communiquant et échangeant avec smalltalk.
C'est ce qui ne marchait plus depuis 3.7. On avait dans le browser le code smalltalk et non le code prolog. Cela semble réparé maintenant.
Dans une méthode smalltalk on peut faire exécuter une expression prolog:
Exécute dans un workspace:
LCompiler evaluate: 'Family new :? father(x,y)'
La réponse est le même tableau que si tu avais exécuté la chaîne dans un Prolog WorkSpace:
#(#('John' 'Mary') #('John' 'David') #('David' 'Jack') #('Arthur' 'Nancy'))
PAD -------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Stéphane Rollandin Date: dim. 08/06/2008 17:18 À: Squeak in french / Squeak en français Objet : Re: [Squeak-fr] Prolog pour 3.10
cdrick a écrit :
dans le document, ca parle de LogicBrowser, il n'y en a pas dans l'implémentation actuelle ? J'imagine que LParser et LCompiler sont censés permettre d'utiliser une browser classique... ?
à l'origine sans doute mais visiblement ce n'est plus le cas...
Stef
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
ReBonjou
Un peu de géométrie:
Installez votre prolog comme décrit précédement. Installez le changeset ci-joint.
Ouvrez un prologWorkSpace. Ouvrez un transcript.
Dans le prologWorkSpace exécutez le code ci-dessous
Geom new :? initBase(). Geom new :? enonce(milieu('i',['a' ,'b'])). Geom new :? enonce(milieu('j',['b' ,'c'])). Geom new :? enonce(milieu('k',['c' ,'d'])). Geom new :? enonce(milieu('l',['d' ,'a'])).
Geom new :? faits(). Geom new :? deduis().
et vous aurez dans le transcript:
Base vide Faits #milieu('i' ['a' 'b' ] ) : énoncé #milieu('j' ['b' 'c' ] ) : énoncé #milieu('k' ['c' 'd' ] ) : énoncé #milieu('l' ['d' 'a' ] ) : énoncé Déductions : #paral(['b' 'd' ] ['i' 'l' ] ) : thales2 #paral(['a' 'c' ] ['i' 'j' ] ) : thales2 #paral(['b' 'd' ] ['j' 'k' ] ) : thales2 #paral(['i' 'l' ] ['j' 'k' ] ) : paralTrans3 #paral(['i' 'l' ] ['b' 'd' ] ) : paralTrans2 #paral(['j' 'k' ] ['i' 'l' ] ) : paralTrans3 #paral(['j' 'k' ] ['b' 'd' ] ) : paralTrans #paral(['a' 'c' ] ['k' 'l' ] ) : thales2 #paral(['i' 'j' ] ['k' 'l' ] ) : paralTrans3 #paral(['i' 'j' ] ['a' 'c' ] ) : paralTrans2 #paral(['k' 'l' ] ['i' 'j' ] ) : paralTrans3 #paral(['k' 'l' ] ['a' 'c' ] ) : paralTrans #trapeze(['b' 'd' 'i' 'l' ] ) : trapeze #trapeze(['a' 'c' 'i' 'j' ] ) : trapeze #trapeze(['b' 'd' 'j' 'k' ] ) : trapeze #trapeze(['i' 'l' 'j' 'k' ] ) : trapeze #trapeze(['a' 'c' 'k' 'l' ] ) : trapeze #trapeze(['k' 'l' 'i' 'j' ] ) : trapeze #parallélogramme(['i' 'j' 'k' 'l' ] ) : parallélo Fin des déductions
Pour voir les règles, Regardez la classe Geom clauses regle
Pour le moteur d'inférence, Regardez la classe Expert.
Le tout repris de ce que j'avais fait avec Squeak 3.6
Encore un grand Merci pour avoir sauvé Prolog.
J'ai testé celà dans la future image commune OLPC - SqueakLand de Yoshiki.(dérive d'une 3.8)
PAD
-------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Dreyfuss Pierre-André (EDU) Date: sam. 14/06/2008 02:21 À: Squeak in french / Squeak en français Objet : RE : [Squeak-fr] Prolog pour 3.10
Bonjour.
On utilise un browser normaL pour écrire des clauses Prolog.
Le Lparser détecte au format de la méthode s'il sagit d'une méthode smalltalk ou de la syntaxe prolog.
La syntaxe prolog est très proche d'un prolog standard La principale différence est l'usage de minuscules pour les variables alors qu'un prolog standard utilise ds majuscules, ceci pour respecter les règles de smalltalk.
Le code "pseudo smalltalk" est en fait réellement du code smalltalk car le parseur convertit la méthode écrite en prolog en la méthode smalltalk qui fait le travail dans l'environnement smalltalk. Mais l'utilisateur n'a à voir que le code prolog dans le browser, le but étant d'utiliser et de penser en prolog tout en communiquant et échangeant avec smalltalk.
C'est ce qui ne marchait plus depuis 3.7. On avait dans le browser le code smalltalk et non le code prolog. Cela semble réparé maintenant.
Dans une méthode smalltalk on peut faire exécuter une expression prolog:
Exécute dans un workspace:
LCompiler evaluate: 'Family new :? father(x,y)'
La réponse est le même tableau que si tu avais exécuté la chaîne dans un Prolog WorkSpace:
#(#('John' 'Mary') #('John' 'David') #('David' 'Jack') #('Arthur' 'Nancy'))
PAD -------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Stéphane Rollandin Date: dim. 08/06/2008 17:18 À: Squeak in french / Squeak en français Objet : Re: [Squeak-fr] Prolog pour 3.10
cdrick a écrit :
dans le document, ca parle de LogicBrowser, il n'y en a pas dans l'implémentation actuelle ? J'imagine que LParser et LCompiler sont censés permettre d'utiliser une browser classique... ?
à l'origine sans doute mais visiblement ce n'est plus le cas...
Stef
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
Dreyfuss Pierre-André (EDU) a écrit :
Le Lparser détecte au format de la méthode s'il sagit d'une méthode smalltalk ou de la syntaxe prolog.
... c'est à ce point-là que j'ai modifié le parseur: voir discussion ci-dessous
Le code "pseudo smalltalk" est en fait réellement du code smalltalk car le parseur convertit la méthode écrite en prolog en la méthode smalltalk qui fait le travail dans l'environnement smalltalk. Mais l'utilisateur n'a à voir que le code prolog dans le browser, le but étant d'utiliser et de penser en prolog tout en communiquant et échangeant avec smalltalk.
le problème c'est que le source est dissocié du bytecode d'une façon qui a pu être acceptable à une époque mais qui ne l'est plus et que les outils comme le débuggeur, shout et le même le mécanisme de file-in ne comprennent pas. je pense que ce serait mieux si le prolog n'était qu'une simple extension de smalltalk, comme j'ai fait avec LispKit. c'est beaucoup plus interopérable.
C'est ce qui ne marchait plus depuis 3.7. On avait dans le browser le code smalltalk et non le code prolog. Cela semble réparé maintenant.
pas exactement: ce que j'ai fait, c'est rapprocher la syntaxe prolog de la syntaxe smalltalk. auparavant, le nom de la méthode associée à un prédicat était caché; il était généré en bytecode mais pas en source, d'où le plantage de certains outils et protocoles.
auparavant, la méthode définissant les faits et clauses pour le prédicat father avait pour nom father: , mais cela n'apparaissait pas dans les browser. maintenant, la méthode est nommée dans le code source, apparaissant donc de façon normale dans le browser, et son nom est logicFather ou bien primlogicFather: si c'est une primitive prolog, c'est à dire une méthode en smalltalk (de un argument, assoc).
c'est essentiellement ça que j'ai changé (c'est un peu brut de décoffrage pour le moment, on peut l'optimiser de beaucoup)
Dans une méthode smalltalk on peut faire exécuter une expression prolog:
Exécute dans un workspace:
LCompiler evaluate: 'Family new :? father(x,y)'
La réponse est le même tableau que si tu avais exécuté la chaîne dans un Prolog WorkSpace:
#(#('John' 'Mary') #('John' 'David') #('David' 'Jack') #('Arthur' 'Nancy'))
oui, mais le cut ne fonctionne pas. essaie Family new :? father(x,y),!. dans le workspace...
le problème, c'est que le modèle du Prolog Workspace est une instance de Prolog, alors que dans Family new :? father(x,y),!. le doIt qui implémente le cut s'attend à être exécuté dans le contexte de Family new, ce qui n'est donc pas le cas dans le workspace. cf le code dans LParser>>#predCut.
tout ceci est assez inélégant, et l'articulation entre instance et classe dans Prolog et ses sous-classes peu pertinente AMHA.
je suis très tenté de revoir en profondeur l'implémentation de ce Prolog.. :)
Stef
Bonjour,
Merci pour ces informations et précision.
cela confirme mon intuition que l'adaptation de prolog aux nouveau code revisé n'était possible que par des connaisseurs des mécanisme interne de Squeak et de l'évolution des versions.
J'avais utilisé il y a 20 ans prolog avec Smalltalk V déjà pour coupler construction de figures géométriques et déductions. Avec mon projet v-Geom de construction de figures écrit avec E-toys et prolog dans Smalltalk 3.6 , je touchait au but :-).
Je pense que prolog intégré à Smalltalk donne de la valeur à Smalltalk.
L'utilisation de Prolog dans l'enseignement est complémentaire à Etoys, apportant un autre type de pensée axé sur les conditions et les contraintes d'un problème au lieu des actions à faire pour le résoudre.
Je vais pouvoir mettre dans les pages éducatives d'anciennes activités que j'avais faites avec mes élèves, adaptées à Squeak Prolog et continuer avec prolog couplé à DrGeo et V-Geom.
Encore merci.
-------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Stéphane Rollandin Date: sam. 14/06/2008 20:53 À: Squeak in french / Squeak en français Objet : Re: RE : [Squeak-fr] Prolog pour 3.10
Dreyfuss Pierre-André (EDU) a écrit :
Le Lparser détecte au format de la méthode s'il sagit d'une méthode smalltalk ou de la syntaxe prolog.
... c'est à ce point-là que j'ai modifié le parseur: voir discussion ci-dessous
Le code "pseudo smalltalk" est en fait réellement du code smalltalk car le parseur convertit la méthode écrite en prolog en la méthode smalltalk qui fait le travail dans l'environnement smalltalk. Mais l'utilisateur n'a à voir que le code prolog dans le browser, le but étant d'utiliser et de penser en prolog tout en communiquant et échangeant avec smalltalk.
le problème c'est que le source est dissocié du bytecode d'une façon qui a pu être acceptable à une époque mais qui ne l'est plus et que les outils comme le débuggeur, shout et le même le mécanisme de file-in ne comprennent pas. je pense que ce serait mieux si le prolog n'était qu'une simple extension de smalltalk, comme j'ai fait avec LispKit. c'est beaucoup plus interopérable.
C'est ce qui ne marchait plus depuis 3.7. On avait dans le browser le code smalltalk et non le code prolog. Cela semble réparé maintenant.
pas exactement: ce que j'ai fait, c'est rapprocher la syntaxe prolog de la syntaxe smalltalk. auparavant, le nom de la méthode associée à un prédicat était caché; il était généré en bytecode mais pas en source, d'où le plantage de certains outils et protocoles.
auparavant, la méthode définissant les faits et clauses pour le prédicat father avait pour nom father: , mais cela n'apparaissait pas dans les browser. maintenant, la méthode est nommée dans le code source, apparaissant donc de façon normale dans le browser, et son nom est logicFather ou bien primlogicFather: si c'est une primitive prolog, c'est à dire une méthode en smalltalk (de un argument, assoc).
c'est essentiellement ça que j'ai changé (c'est un peu brut de décoffrage pour le moment, on peut l'optimiser de beaucoup)
Dans une méthode smalltalk on peut faire exécuter une expression prolog:
Exécute dans un workspace:
LCompiler evaluate: 'Family new :? father(x,y)'
La réponse est le même tableau que si tu avais exécuté la chaîne dans un Prolog WorkSpace:
#(#('John' 'Mary') #('John' 'David') #('David' 'Jack') #('Arthur' 'Nancy'))
oui, mais le cut ne fonctionne pas. essaie Family new :? father(x,y),!. dans le workspace...
le problème, c'est que le modèle du Prolog Workspace est une instance de Prolog, alors que dans Family new :? father(x,y),!. le doIt qui implémente le cut s'attend à être exécuté dans le contexte de Family new, ce qui n'est donc pas le cas dans le workspace. cf le code dans LParser>>#predCut.
tout ceci est assez inélégant, et l'articulation entre instance et classe dans Prolog et ses sous-classes peu pertinente AMHA.
je suis très tenté de revoir en profondeur l'implémentation de ce Prolog.. :)
Stef
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
cdrick a écrit :
J'adore archive.org :) http://web.archive.org/web/*/http://bolot.net/squeak/prolog/v-prolog.pdf
ah, merci. j'ai réussi à récupérer le pdf à partir du dernier lien
Stef
ce genre de problème n'est pas très étonnant vu que le format des méthodes prolog est sensiblement différent de Smalltalk. je pense qu'il faudrait revoir l'implémentation du LParser et ne plus définir les clauses dans des pseudo-méthodes qui ne sont pas du Smalltalk.
je vais voir si je ne peux pas utiliser le genre d'astuces qui m'ont réussi avec LispKit pour revoir ce Prolog.
bon, en attendant mieux voici déjà une version de Prolog que l'on peut explorer plus en sécurité...
j'ai modifié LParser et le #doesNotUnderstand de Logic
maintenant, les méthodes en Prolog doivent avoir un nom qui commence par "logic": par example #logicFather définit le prédicat father.
les primitives, c'est-à-dire les méthodes qui définissent un prédicat prolog implémenté en Smalltalk, doivent avoir un nom qui commence par "primlogic" et leur unique argument doit être "assoc".
c'est un peu rustique mais ça a l'air de fonctionner. testé sur 3.8 et 3.10 (y compris le squeak-dev, version web), mais je n'ai toujours pas fait plus de tests que l'example du PrologWorkspace openDemoFamily
ok, cool. Au fait tu ne viens pas au RMLL par hasard ?
non
Stef
bon, le Prolog que je vient d'envoyer plante horriblement si l'on teste
Dungeon new :? go()
... voici donc une nouvelle version, cinq minutes après la précédente :)
Stef "ce sont les risques du direct"
cdrick a écrit :
merci bien en tout cas car il se pourrait que j'tilise prolog pour le projet GSoC. Pas sur ceci...
première chose à faire: des tests !
voici d'ailleurs une troisième version, avec le Dungeon en morphic et deux ou trois bugs en moins:
PrologWorkspace openDemo
Stef
Je pense que cela vient d'ici...
CompiledMethod>>replace:with:in:
args := (self methodClass parserClass new parseArgsAndTemps: aText string notifying: nil) copyFrom: 1 to: self numArgs.
avec aText qui vaut: a Text for 'healthHistory(''John'', ''John had two times of heart attacks''). healthHistory(''Mary'', ''Mary had no serious problems'').'
(self methodClass parserClass new parseArgsAndTemps: aText string notifying: nil) retourne un tableau vide...
ptet il faut implementer parseArgsAndTemps: aText string notifying différement...
Bonjour
Excellente nouvelle
Je vais m'empresser de le tester.
-------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Stéphane Rollandin Date: dim. 08/06/2008 00:50 À: Squeak in french / Squeak en français Objet : [Squeak-fr] Prolog pour 3.10
salut à tous,
je réponds ici à un message de mars dernier:
Dreyfuss Pierre-André (EDU) a écrit :
Bonjour, Celà relance le problème de disposer d'un prolog fonctionnant en Squeak. J'avais vu dans une discussion une promesse de mise à jour mais 'si rien vu venir.
La dernière version où prolog marche est squeak 3.6. Dans 3.7 celà semble marcher mais à la première erreur tout plante et Sqeak se bloque.
en fichier joint, vous trouverez de quoi installer Prolog dans une image récente (j'ai testé 3.8, 3.9 et 3.10)
usage: pour 3.9 et 3.10, chargez d'abord le changeset PreFixes (pour 3.8 c'est inutile), puis balancez le Prolog 13Dec1628, et enfin le PostFixes.
le PostFixes s'occupe de remplacer les tests en "class == Symbol" par "isSymbol", nécessaire depuis l'introduction de ByteSymbol (ce qui ne nous rajeunit pas). Le PreFixes bidoulle dans le Parser, mais rien de grave ne vous inquiétez pas... il copie deux méthodes de 3.8 qui ont disparu en 3.9 pour cause de pragmas ou un truc du genre.
après vous pouvez faire "PrologWorkspace openDemoFamily" et évaluer les deux expressions. ça marche. je n'ai pas testé plus loin...
Stef
Dreyfuss Pierre-André (EDU) a écrit :
Bonjour
Excellente nouvelle
Je vais m'empresser de le tester.
la dernière version est sur SqueakMap: http://map.squeak.org/account/copackage/cb6c7afe-d517-470f-8857-d764ef321725...
Stef
... et voici une nouvelle version de Prolog, en fichier joint et sur SqueakMap. (le système de database était cassé)
j'ai ajouté quelques tests; n'oubliez pas que ce code est encore exprérimental !
Stef
... et encore une nouvelle version de Prolog :)
maintenant nous avons un browser spécifique à Prolog couplé à un REPL qui s'ajuste automatiquement à la classe sélectionnée.
les réponses du REPL sont formatées: nil devient "No." et #(()) devient "Yes.", tandis que les réponses uniques (singletons) sont imprimées directement et les réponse multiples dispatchées sur plusieurs lignes. l'ensemble donne une interface beaucoup plus conviviale que le Prolog Workspace, et en prime les cut y fonctionnent...
cf fichier joint pour illustration.
j'ai aussi ajouté des tests d'après le tutoriel que l'on trouve à http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html
Stef
Vraiment super.
Je vais faire une doc avec des exemples pour les débutants sur ofset. Il y a un petit problème avec write /1 qui écrit dans le Transcript mais ne provoque plus l'affichage.
( au lieu de Transcript show: .... il y a Transcript Transcript nextPutAll:
Pour provoquer l'affichage il faut utiliser: write('Super'),is(_,Transcript endEntry).
ou définir
logicWriteTranscript "Write to the Transcript" writeTranscript(s):- write(s), is(_,Transcript endEntry).
Le fait de ne pas tout afficher à chaque write permet par contre de gagner du temps lors de l'exécution et de tout afficher d'un coup.
D'autre part se pose la question de faire écrire write dans le Gui.
Soit une primitive writeGui
ou une primitive write /2 : write(<texte cible>,<string>)
Je peux m'occuper de faire un module grammaire que je dois avoir fait en son temps pour un prolog qui n'avait pas de grammaire.
Ce module pourra être utilisé pour convertir des textes issus de prolog standard en squeak prolog. Pad
-------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Stéphane Rollandin Date: lun. 16/06/2008 15:18 À: Squeak in french / Squeak en français Objet : [Squeak-fr] Prolog pour 3.10
... et encore une nouvelle version de Prolog :)
maintenant nous avons un browser spécifique à Prolog couplé à un REPL qui s'ajuste automatiquement à la classe sélectionnée.
les réponses du REPL sont formatées: nil devient "No." et #(()) devient "Yes.", tandis que les réponses uniques (singletons) sont imprimées directement et les réponse multiples dispatchées sur plusieurs lignes. l'ensemble donne une interface beaucoup plus conviviale que le Prolog Workspace, et en prime les cut y fonctionnent...
cf fichier joint pour illustration.
j'ai aussi ajouté des tests d'après le tutoriel que l'on trouve à http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html
Stef
j'ai redéfini write/1 et nl/0 pour qu'ils émettent sur le outputstream du Prolog. c'est dans la dernière version sur SqueakMap (ça va très vite en ce moment :)
par défault on a donc écriture dans le REPL. reste à rediriger vers le Transcript lorsqu'on le décide, ce n'est pas encore implémenté.
Stef
Dreyfuss Pierre-André (EDU) a écrit :
Vraiment super.
Je vais faire une doc avec des exemples pour les débutants sur ofset. Il y a un petit problème avec write /1 qui écrit dans le Transcript mais ne provoque plus l'affichage.
( au lieu de Transcript show: .... il y a Transcript Transcript nextPutAll:
Pour provoquer l'affichage il faut utiliser: write('Super'),is(_,Transcript endEntry).
ou définir
logicWriteTranscript "Write to the Transcript" writeTranscript(s):- write(s), is(_,Transcript endEntry).
Le fait de ne pas tout afficher à chaque write permet par contre de gagner du temps lors de l'exécution et de tout afficher d'un coup.
D'autre part se pose la question de faire écrire write dans le Gui.
Soit une primitive writeGui
ou une primitive write /2 : write(<texte cible>,<string>)
Je peux m'occuper de faire un module grammaire que je dois avoir fait en son temps pour un prolog qui n'avait pas de grammaire.
Ce module pourra être utilisé pour convertir des textes issus de prolog standard en squeak prolog. Pad
-------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Stéphane Rollandin Date: lun. 16/06/2008 15:18 À: Squeak in french / Squeak en français Objet : [Squeak-fr] Prolog pour 3.10
... et encore une nouvelle version de Prolog :)
maintenant nous avons un browser spécifique à Prolog couplé à un REPL qui s'ajuste automatiquement à la classe sélectionnée.
les réponses du REPL sont formatées: nil devient "No." et #(()) devient "Yes.", tandis que les réponses uniques (singletons) sont imprimées directement et les réponse multiples dispatchées sur plusieurs lignes. l'ensemble donne une interface beaucoup plus conviviale que le Prolog Workspace, et en prime les cut y fonctionnent...
cf fichier joint pour illustration.
j'ai aussi ajouté des tests d'après le tutoriel que l'on trouve à http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html
Stef
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
Dans swi prolog on a :
write(+Stream, +Term) Write Term to Stream. Je pense qu'il est mieux de garder l'odre des termes en Prolog, ce sera plus facile de convertir du prolog standard vers squeak prolog.
En fait je ne pensais pas aux fichers, mais à écrire dans des textMorph.
pad -------- Message d'origine-------- De: squeak-fr-bounces@lists.squeakfoundation.org de la part de Stéphane Rollandin Date: mer. 18/06/2008 13:34 À: Squeak in french / Squeak en français Objet : Re: RE : [Squeak-fr] Prolog pour 3.10
ou une primitive write /2 : write(<texte cible>,<string>)
ou bien write(<string>, <stream>), comme en Lisp ?
Stef
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr
squeak-fr@lists.squeakfoundation.org