MOVE CUBE 3d
(-; Vous avez lu les conventions ? Il vaudrait mieux !... ;-)
Dernière incursion, dans cette Compilation, dans le domaine
de la Tortue. Je ne me souviens plus très bien la dernière
fois où j'ai adapté ce programme ; était-ce pour Thomson
ou pour Atari ?... Ces procédures sont censées produire un
effet 3d (cette dernière ne pouvant exister sur un écran 2d,
soyons claire) ; un cube "grandit" et "redevient" petit
en tournant sur lui même sur toute la surface de l'écran.
POUR CUB :C ;;construisons le cube de taille c
REPETE 4 [AV :C TD 90]
AV :C TD 45 AV :C TD 45 AV :C
TD 135 AV :C RE :C TG 45 AV :C
TD 45 AV :C RE :C TD 45 AV :C
TD 90 AV :C RE :C TD 45 RE :C TG 45
FIN ;;ais-je bien remis la Tortue à sont point de départ
et dans la direction (cap) du départ ?!...
POUR TRI_D :C :A ;;jouer avec un, des angle(s)
SI :C > 120 [RECYCLE DONNE "A 30 TC :C :A STOP]
;;ah ce Recycle "d'avant" les Pentium !...
CUB :C NETTOIE TD :A ;;Nettoie : une Primitive à
découvrir...
TRI_D :C + 5 :A + 2
FIN
POUR TC :C :A ;;l'effet inverse de la procédure précédente
!
SI :C < 15 [RECYCLE FCAP 0 TRI_D :C :A STOP]
SI :A < 10 [DONNE "A 30]
CUB :C NETTOIE TG :A
TC :C - 5 :A - 2
FIN
POUR MC3D ;;movecube3d, banane !
RECYCLE VE CT TRI_D 10 30
FIN
Rêvons un instant de travailler sous Unix sur une
station NeXT (fabuleuse machine
tout aussi disparue que "l'auteur" de ce message stressant : %DecSystem-20 Not Running% - voir CMIRH) ou Sun ... Le jour dit, le Système nous souhaiterait
notre anniversaire au moment de notre connections. Le programme ci-dessous
simule cette gentillesse. Si vos machines sont en réseaux, divisez
ce programme en deux procédures : OPERATEUR qui indique la date du
jour et ENFANT faisant le reste ... Ailleurs, en ces pages, j'offre une
version plus récente de ce programme,
plus "interactive" et proche des recommandations ci-dessus et,
en musique ! Ce qui suit est un programme de base plus proche d'un exercice classique réalisé avec
mes élèves.
POUR ANNIVERSAIRE
EC [ENTREZ LA DATE DU JOUR (tel que : 02 02 1947) S.V.P.]
;;avec les machine actuelles, serait-ce toujours indispensable ?
En êtes-vous certain ?
DONNE "DATE LL
DONNE "ANNIV PH PREMIER :DATE PREMIER SP :DATE
;;je n'encombre pas avec les tests "mauvais utilisateurs",
mais, interdire les
;;manipulations stupides est aussi un bon exercice de programmation !...
VT
EC [ENTREZ VOTRE PRENOM.]
DONNE "P LL EC "
EC [ENTREZ VOTRE DATE DE NAISSANCE (tel que 02 02) S.V.P.]
;;eh oui : ici, nous n'avons rien à faire de l'année...
DONNE "N LL VT
SI EGAL? :N :ANNIV [EC PH PH [JOYEUX ANNIVERSAIRE, ] :P !
"!] [EC PH [JE N'AI PAS DE MESSAGE POUR TOI AUJOURD'HUI,
] :P
FIN
LOGO, LISP,
PROLOG
Avec REFAIRE (voir Sommaire), nous avons déjà
pratiqué un exercice classique lorsque l'on aborde LISP, à
savoir : re-créer des primitives. Si nous voulions ré-écrire
DERNIER de LOGO, nous devrions créer INVERSER (cf. Sommaire)
; alors que c'est déjà une primitive LISP (et
pas lips !...). Dans ce langage, ré-écrivons LAST :
(def LAST (X)
(inv(CAR(INV(X)))))
Cet exemple montre bien l'importance des parenthèses qui n'est pas sans rappeler celle des crochets en LOGO. Chacun connait les similitudes entre ces deux langages ; la démarche proposée de passer de LOGO à LISP n'est pas gratuite...
Lors, oublions tout pour regarder du côté de PROLOG. Je ne vais pas présenter ce langage, mais juste prendre un exemple pour le plaisir de le détourner en LOGO !
(aime (Jean Marie))
?aime (X Y), write (X Y)
;;retourne Jean Marie
?aime (X Marie), write (X)
;;retourne Jean
?aime (Jean Y), write (Y)
;;retourne Marie
Je vous laisse imaginer tout ce que vous pourriez obtenir si vous déclariez :
(aime (Jean Marie))
(aime (Paul Virginie))
(aime (Sylvain Sylvaine))
(aime (Titi Sylvestre))
(aime (Florent Vanessa)) ;;oui, bon : là, ce n'est plus d'actualité...
;-)
Allez donc traduire ceci en LOGO !... Par contre, nous pouvons en tirer une idée de programme toute 'philosophique'...
POUR LOVE
EC [ENTREZ UN PRENOM MASCULIN (tel que Jean)] ;;non composé
DONNE "M LL
EC [ENTREZ UN PRENOM FEMININ (tel que Marie)] ;;idem. Je ne teste
pas
DONNE "F LL
EC PH PH PH PH PH [PRETENDRIEZ-VOUS QUE] :M "AIME :F "? [(O/N)]
DONNE "A PREMIER LL ;;je ne teste pas
SI EGAL? :A "N [EC "DOMMAGE STOP] [EC PH PH PH PH PH !
[PARTANT, DIRIEZ-VOUS QUE] :F "AIME :M "? [(O/N)]
DONNE "A2 PREMIER LL ;;je ne teste toujours pas
SI EGAL? :A2 "N [EC [NOUS SOMMES D'ACCORD !] [EC PH PH PH !
[TIENS DONC ? POUR MA PART, LA PREMIERE PROPOSITION ENTRAINE !
UNIQUEMENT QUE :F [EST AIME DE] :M]
EC CAR 7 ;;ou car 13 ou ec " (rien)....
EC [JE VOUS REMERCIE !...]
FIN
FABLE - I.A.
Ceci est un classique tout comme le plus complexe "Les
Missionnaires et les Cannibales", mais aussi, comme HANOI ou
NIM (voir Sommaire), un classique en ce qui
concerne ce que nous regardons ici : l'Intelligence Artificielle.
L'histoire : Il était une fois, sur les rives d'une rivière, un passeur et sa barque, un loup, une chèvre, un chou. L'homme devait transporter ces trois passagers de la rive gauche à la rive droite. Comment pouvait-il s'y prendre sachant que : il ne peut transporter qu'un passager à chaque voyage et que, s'il n'a rien à craindre du loup, celui-ci aimerait bien manger la chèvre et que cette dernière verrait bien le chou à son menu du jour ? Evidemment : cette histoire est contée (au minimum ainsi) au(x) joueur(s).
POUR BD ;;la base de données comprends des astuces
;;permettant certaines 'économies'...
DONNE "RG "RIVE_GAUCHE
DONNE "RD "RIVE_DROITE
DONNE "X [BARQUE_1 HOMME_2 CHEVRE _3 LOUP_4 CHOU_5]
DONNE "Q1 PH PH PH PH PH [QUE PASSEZ-VOUS DE ] :RG "A :RD
!
[2 ou 3 numéros choisis dans] :X
DONNE "Q2 PH PH PH PH PH [QUE PASSEZ-VOUS DE ] :RD "A :RG
!
[2 ou 3 numéros choisis dans] :X
FIN ;;pas de test pour les joueurs stupides (ne suivant pas les
instructions)
POUR DEBUT
VT BD
EC PH PH :X [SONT SUR LA] :RG
EC PH [VOUS DEVEZ LES PASSER SUR LA] :RD
EC [TOUT EN FAISANT ATTENTION A CE QUE :]
EC PH PH ITEM 3 :X [NE MANGE PAS] ITEM 5 :X
EC PH PH PH [ET QUE] ITEM 4 :X [NE MANGE PAS] ITEM 3 :X
EC [Ces gueuletons sont évités par la présence de l'homme
!
auprès des 'prédateurs']
EC []
JEU
FIN
POUR JEU
EC :Q1
DONNE "CHOIX LL
SI NON EGAL? :CHOIX [1 2 3] [EC "NIET JEU STOP] EC "OK J1]
FIN
POUR J1
EC :Q2
DONNE "CHOIX LL ;;précaution d'écraser :CHOIX
à chaque fois
;;pour la place mémoire. Sage précaution avant les Pentium
et bonne habitude,
;;pour une programmation "propre", élégante, de
nos jours ...
SI NON EGAL? :CHOIX [1 2] [EC "NIET J1 STOP] [EC "OK J2]
FIN
Et ainsi de suite avec :
J2 = Q1, si choix = [1 2 5] alors J3
J3 = Q2, si choix = [1 2 3] alors J4
J4 = Q1, si choix = [1 2 4] alors J5
J5 = Q2, si choix = [1 2] alors J6
POUR J6
EC :Q1
DONNE "CHOIX LL
SI NON EGAL? :CHOIX [1 2 3] [EC "NIET J6 STOP] !
[EC [BRAVO ! TERMINE...]]
FIN
Bien d'autres démarches sont possibles ; survolons-en une en faisant appel à d'autres connaissances :
Nous avons la liste : [homme barque chèvre loup chou] soit :
[H B CH L CX] codifiée ainsi : [1 2 3 4 5]
Conservons le même ordre dans la liste, mais changeons notre codification en utilisant les puissances de 2, nous obtenons :
[1 2 4 8 16] dont la somme est égale à 31
Puis, avec ET et XOU (AND et XOR), voyons les éléments de la liste pouvant aller ensembles (demeurer, voyager sans danger), c'est-à-dire, étant VRAI (égal à 1 ; 0 étant FAUX) :
H AND B = 1
CH XOR L = 1
CH XOR CX =1
CH AND L AND H = 1
CH AND CX AND H = 1
Ce qui entraîne que :
H AND B AND (CH XOR L) = 1
H AND B AND (CH XOR CX) = 1
Ceci est vérifiable avec une table de vérité. Maintenant, allons plus loin dans notre codification :
H AND B -> 1 + 2 = 3
CH XOR L -> 4 = 4 ou 8 = 8
CH XOR CX -> 4 = 4 ou 16 = 16
L AND CX -> 8 + 16 = 24
H AND B AND (CH XOR L) -> 1 + 2 + (4 ou 8) = 7 ou 11
H AND B ANC (CH XOR CX) -> 1 + 2 + (4 ou 16) = 7 ou 19
Nous obtenons ainsi la liste des voyages possibles : [3 7 11 19]
Et celle de ce qui peut demeurer sans danger (sans l'homme) : [4 8 16 24 31]
Et alors ? Nous avons 31 sur la RG, si nous désirons passer la Barque et le Chou qui font 18, ce sera impossible ; 18 n'étant pas membre des 2 dernières listes ci-dessus. Nous tentons de passer la Barque, l'Homme et le Chou qui font 19 ; c'est possible pour la raison inverse !
Cette approche permet une meilleure intéractivité dans le jeu par rapport à l'analyse faite pour le programme donné en exemple plus haut.
Avec PROLOG, nous affinerions encore plus notre analyse et notre jeu serait encore plus interactif. En effet, nous pourrions vérifier si l'Homme est déjà ou non dans la Barque, si la Barque est pleine ou vide, si celle-ci se trouve bien sur telle Rive et non sur l'autre. Et, vérifier que tel élément se trouve à tel endroit et non pas ailleurs (déjà ailleurs), etc.
MAIS CECI EST UNE AUTRE HISTOIRE !...