3. Spécificités de Prolog II+ Windows. PrologIA HERITAGE II+
Ci-dessous, vous trouverez de brèves informations concernant II+ Prolog. Ce manuel de référence décrit en détail le langage Prolog II+, son utilisation, ainsi que ses caractéristiques, comme la compilation incrémentale, la modularité, l'ouverture vers d'autres langages et l'environnement de programmation.
A!ociation
Prolog
HERITAGE
3. Spécificités de Prolog II+ Windows
3.1. Valeurs extrêmes des constantes arithmétiques
3.2. Les caractères dans la syntaxe Prolog II+
3.3. Personnalisation d'une Application
3.4. Modification du Programme principal
3.5. Extensions en mode 16 bits
3.6. Utilisation de PrologII+ sous forme de DLL
3.1. Valeurs extrêmes des constantes arithmétiques
Les booléens sont représentés par les entiers 0 et 1.
Les valeurs des entiers manipulés dans Prolog ne sont pas limitées à priori. Les valeurs des entiers qui peuvent être communiqués avec un langage externe sont comprises entre -2 147 483 648 et 2 147 483 647 (231-1) : ceci correspond au type
long int de C.
Les réels manipulés dans Prolog correspondent au type double de C (IEEE 64 bits).
Les valeurs des doubles sont comprises entre -1.79e308 et +1.79e308 et la plus grande valeur négative et la plus petite valeur positive sont respectivement -2.2e-308 et +2.2e-308. Certaines fonctions de communication acceptent uniquement des réels simple précision. Les valeurs des réels simple précision sont comprises entre
-3.4e38 et +3.4e38 et la plus grande valeur négative et la plus petite valeur positive sont respectivement -1.2e-38 et +1.2e-38. Ces réels correspondent au type float de
C (IEEE 32 bits).
3.2. Les caractères dans la syntaxe Prolog II+
Tout au long du premier chapitre du manuel de référence la syntaxe était plus spécialement décrite pour le jeu ISO, ce chapitre décrit une partie de la syntaxe relative aux caractères, adaptée au système Windows. Elle est valide pour chaque session Prolog qui utilise le jeu de caractères de la machine hôte.
Il faut noter que si MS-DOS utilise le jeu de caractères OEM, Windows utilise le jeu ANSI qui correspond pratiquement au jeu ISO. Il est donc possible que des fichiers écrits sous MS-DOS et contenant des caractères accentués affichent des rectangles noirs aux emplacements correspondants lorsqu'ils apparaissent dans une fenêtre Windows. Il est conseillé de créer les fichiers de texte avec un éditeur sous
Windows.
© PrologIA
U 3 - 2
Manuel d'Utilisation Windows
big_letter = letter = digit = alpha = separator = separatorP= special_char = special_charE = graphic_c = graphic_charE = graphic_char = character = string_char = format_escape =
"A" | … | "Z" ; big_letter | "a" | … | "z"
| "À" … "ß" - "$"
| "à" … "ÿ" - "÷";
"0" | … | "9" ; letter | digit | "_";
"(" | ")" | "[" | "]" | "{" | "}"
| "|" | "," ;
";" | "." | "<" | ">" ;
"%" | "'" | """ | "_" | "!" | "`" |;
";" ; graphic_char | "\", graphic_char ;
"." | "<" | ">" ;
"#" | "$" | "&" | "*" | "+" | "-" | ":"
| "/" | "=" | "?" | "\" | "@" | "^" | "~"
| NBSP … ¿ | $ | ÷ ; letter | digit | separator | graphic_char | special_char ; character - ( """ | "\") | """"
| "\", format_escape ;
"b" | "f" | "n" | "r" | "t" | "\"
| newline
| octal_digit, octal_digit, octal_digit
| ("x" |"X"), hex_digit, hex_digit ;
3.3. Personnalisation d'une Application
Lors de l'initialisation de l'Application, la DLL customiz.dll est chargée si elle existe dans le répertoire qui contient l'exécutable de Prolog. Cette DLL ne contient pas de code exécutable, son rôle est de servir de support pour les ressources utilisateur. En effet, l'exécutable de Prolog contient déjà les ressources de Prolog. Les ressources utilisateur seront donc compilées et liées à ce module en utilisant un fichier makefile fourni.
Les ressources suivantes sont recherchées lors de l'initialisation et si elles existent, remplacent les ressources originales correspondantes:
10
est une ressource de type Icône, elle sera utilisée à la place de l'icône
"Colonne" de Prolog pour représenter la fenêtre principale de l'Application.
Elle peut également être utilisée pour représenter l'Application dans la fenêtre du Gestionnaire d'Applications: il faut pour cela la rechercher dans le module
customiz.dll (au lieu de prolog.exe).
© PrologIA
A!ociation
Prolog
HERITAGE
A!ociation
Prolog
HERITAGE
Spécificités de Prolog II + Windows
U 3 - 3
1, dans une ressource STRINGTABLE
est une ressource de type chaîne de caractères, qui sera utilisée comme titre initial de la fenêtre principale de Prolog, à la place de "Prolog II+". Attention, ne pas oublier que dans une ressource, le caractère '\0' final doit être explicite.
100
est une ressource de type Description de Boîte de Dialogue, qui pourra être
écrite à la main ou en utilisant l'Editeur de Dialogues du SDK. Si elle est trouvée, l'item "A propos de Prolog ..." du menu "Application" disparaît et l'item "A propos ..." est validé, commandant l'ouverture de cette "About Box".
Son contenu peut être quelconque, mais un seul bouton sera reconnu, et devra porter l'identificateur 1 (IDOK).
D'autres ressources utilisateur peuvent être fournies, mais elles ne seront pas gérées automatiquement. Suivre la procédure standard du système. Se rappeler seulement deux points essentiels:
- Votre fonction de dialogue doit aussi être exportée par l'Application, donc il faut la rajouter dans le module prolog.def.
- Votre ressource sera localisée dans le module customiz.dll et non dans
prolog.exe, donc il faut utiliser le handle hUserDLL, disponible dans prouser.c, à la place du handle d'instance, dans toutes les primitives manipulant vos ressources (DialogBox(), ...).
Dans le cas de Windows 3 et pour utiliser des ressources au moyen d'extensions
16 bits, il sera plus judicieux de lier ces ressources directement à la DLL d'extension.
Le module userrsc.rc, fourni dans le kit, est un exemple de script de ressources de personnalisation. Il a été compilé et inclus dans le fichier customiz.dl_ fourni dans le kit Prolog. Cette DLL doit être renommée en customiz.dll pour avoir une démonstration de cet exemple.
La compilation d'une DLL de personnalisation avec le SDK 16 bits fait l'objet d'une procédure particulière décrite en commentaires dans le fichier userrsc.rc.
3.4. Modification du module principal
Le fichier proentry.c contient le source de la routine principale de Prolog en tant qu'application. Cette routine est largement commentée et effectue des appels aux fonctions:
© PrologIA
U 3 - 4
Manuel d'Utilisation Windows
- InitializeProlog (hInstance, hPrevInstance, lpCmdLine, nCmdShow) qui va faire les initialisations nécessaires au lancement de Prolog. Cette fonction retourne 0 si l'initialisation a réussi, un numéro d'erreur sinon. Ses paramètres sont ceux de la fonction WinMain. . Elle remplace la fonction ProStart mentionnée au chapitre 8 du manuel de référence.
- StartPrologMainGoal() qui va lancer le but principal de Prolog, par appel à la fonction promain(), du fichier princip.c, dont le source est également fourni. Cette fonction retourne 0 si l'appel a réussi, un numéro d'erreur sinon.
L'appel à la fonction StartPrologMainGoal n'est pas obligatoire pour utiliser la machine Prolog, il peut être remplacé par l'appel d'une procédure utilisateur qui installe son propre but et ainsi utilise Prolog en tant que runtime.
Cependant, si cette procédure constitue une tache longue (notion intuitive), elle doit être lancée de la manière décrite dans le fichier afin de ne pas paralyser la machine.
- TerminateProlog() qui accomplira les tâches nécessaires à la terminaison de
Prolog. Elle remplace la fonction ProFinal mentionnée au chapitre 8 du manuel de référence.
Dans ce fichier est également fournie la fonction dont se sert Prolog pour distribuer chaque message Windows lorsque sa lecture est faite de manière interne par l'environnement de Prolog.
3.5. Extensions en mode 16 bits (Réservé Windows 3)
Dans l'environnement 16 bits certaines fonctionnalités ne sont pas accessibles. Cet environnement ne permet pas l'appel direct de fonctions C (via le prédicat callC), la création de zones partagées, l'utilisation de descripteurs et l'utilisation des fonctions
new_pattern et get_formats.
L'ajout de procédures externes est limité à la méthode des parasites décrite en
Annexe D.
Dans la méthode des liens par parasites, un module utilisateur sert de relais entre
Prolog et les routines utilisateur écrites en C. Les numéros de parasites 20000 à
29999 sont réservés aux routines C liées à ce mode. Ce module peut être développé comme pour une DLL Windows 3 standard. Le temps de commutation et de transfert de contrôle est très rapide et tout se passe comme si l'extension était directement liée à l'application 32 bits.
Exemple complet : ajout d'une règle en mode 16 bits
Voici un exemple complet, décrivant l'ensemble des opérations à exécuter pour créer une nouvelle règle prédéfinie implantée par une routine externe en code 16 bits.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Spécificités de Prolog II + Windows
U 3 - 5
Supposons que vous programmiez en C et que vous vouliez ajouter la règle prédéfinie roots(a,b,c,x,y) qui calcule les deux racines réelles x et y de l'équation: ax 2 + bx + c = 0 si elles existent et qui provoque un backtracking sinon.
Etape par étape, la marche à suivre est la suivante:
0. Copier les fichiers proext.h, libentry.obj, usermpty.c, callpro.h, callpro.def,
callproS.lib, userdll.mak dans votre répertoire courant. Renommer usermpty.c en roots.c. Adapter userdll.mak en affectant la macro SourceName à roots.
1. Ajouter dans le fichier roots.c le code suivant:
#include <math.h> puis real_roots(perr_nb) int *perr_nb;
{ float a, b, c, d, x1; if ( !get_real(1, &a, perr_nb)
|| !get_real(2, &b, perr_nb)
/*backtrack*/ else if ( (d = b * b - 4 * a * c) < 0.)
*perr_nb = -1; /*backtrack*/ else
|| !get_real(3, &c, perr_nb)) return; if ( a == 0.)
*perr_nb = -1;
{ x1 = (-b + sqrt(d)) / (2 * a); if ( ! put_real(4, x1, perr_nb) ) return; put_real(5, -b/a - x1, perr_nb);
}
}
2. Modifier la fonction user_rule du fichier roots.c en ajoutant l'appel du nouveau programme externe. Par exemple, en donnant le numéro 20001 à la nouvelle règle: user_rule(nb, err, err_nb) int nb, *err, *err_nb;
{
*err = *err_nb = 0;
switch (nb)
{
...
case 20001: real_roots(err_nb); break;
...
}
}
3. Effectuer les compilations et l'édition de liens :
$ nmake -f userdll.mak
4. Renommer le fichier roots.dll en prolo-.dll et le copier au même endroit que l'exécutable prolog.
© PrologIA
U 3 - 6
Manuel d'Utilisation Windows
$ copy roots.dll c:\prolog\prolo-.dll
5. Lancer une session Prolog:
$ win prolog
PROLOG II+, ...
... PrologIA
>
6. Insérer l'appel de la règle externe dans le module "":
> insert;
roots(a,b,c,x,y) -> /?20001;
;
{}
>
7. Essayer la nouvelle règle:
> roots(1.0e,-8.0e,15.0e,x,y);
{x=5.0e0, y=3.0e0}
> roots(+2.0e,+4.0e,+8.0e,x,y);
>
3.6. Utilisation de PrologII+ sous forme de DLL
Prolog II+ est également disponible sous la forme d'une DLL 32 bits (fichier
prolog.dll) dénuée de tout environnement: graphisme, entrées/sorties. Cette DLL peut être utilisée par toute application Windows 32 bits, laquelle pourra aussi fonctionner sous Windows 3 étendu de l'API Win32s. La DLL Prolog exporte les routines décrites ci-après, ainsi que les routines classiques décrites au chapitre traitant des extensions en C à Prolog.
On retiendra seulement que toutes ces routines sont exportées par la DLL selon le protocole cdecl. L'utilisation de la librairie d'import (fichier prodll.lib) et de la définition des prototypes (fichier exportsw.h ) évitera tout problème à ce niveau.
ConnectDescriptors( EXTERNAL_DESCRIPTOR * paD[] )
Cette routine permet de déclarer dans le code de l'application le tableau de descripteurs paD, écrit comme on l'aurait fait pour une extension C directe. Ce tableau de descripteurs doit être persistant durant toute la session Prolog qui l'utilise (par exemple, qualifié de static s'il est en position de variable locale), et la déclaration doit être faite avant le début de la session (avant l'appel de
ProStart() ).
Si l'argument est NULL, les descripteurs seront supprimés dans la prochaine session. Si la routine est invoquée plusieurs fois, c'est le dernier tableau qui est pris en compte. La routine retourne 0 en cas de succès, -1 en cas d'échec
(session déjà lancée).
L'exemple fourni avec la DLL utilise une fonction déclarée ainsi.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Spécificités de Prolog II + Windows
U 3 - 7
ConnectUserRule( UserRuleFunction * pfUR )
Cette routine permet de déclarer une fonction d'aiguillage appartenant à l'utilisateur pfUR() pour les extensions C utilisant la méthode des parasites.
Cette fonction jouera le rôle de la fonction user_rule() du module prouser.c.
Le format de cette fonction (type UserRuleFunction défini dans le fichier des prototypes) est imposé: c'est le même que celui de la fonction user_rule().
Si l'argument est NULL, la fonction d'aiguillage couramment installée est supprimée. Par sécurité, il est requis de supprimer la fonction courante avant d'en installer une nouvelle. La routine retourne 0 en cas de succès, -1 en cas d'échec (remplacement refusé).
La gamme de numéros de parasites qui peuvent être installés ainsi est celle qui correspondait aux extensions ordinaires: 1 à 9999.
Les mécanismes relatifs aux autres gammes de numéros restent inchangés: on peut par exemple appeler une fonction externe écrite en mode 16 bits de la même façon qu'avec la version standard de développement (DLL 16 bits).
ConnectInString( InStringFunction * pfIS )
Cette routine permet de compléter la DLL en y ajoutant les entrées, par la déclaration d'une fonction d'entrée de texte pfIS() à laquelle Prolog soumettra toutes les entrées (prédicats): avant l'installation d'une telle fonction, une chaîne vide est rendue pour chaque demande d'entrée (rendant donc celle-ci impossible). Le remplacement et la suppression de cette fonction fonctionnent comme la précédente.
Le format de cette fonction (type InStringFunction défini dans le fichier des prototypes) est imposé: son premier argument est l'adresse d'un buffer prêt à recevoir le texte (donc alloué), son second argument est la capacité maximale de ce buffer. Le code de retour de la fonction est ignoré: en cas d'erreur, elle doit rendre une chaîne vide dans le buffer.
Intérieurement, la fonction peut effectuer toute opération même bloquante (en traitant les événements) nécessaire pour obtenir le texte à retourner.
ConnectOutString( OutStringFunction * pfOS )
Cette routine permet de compléter la DLL en y ajoutant les sorties, par la déclaration d'une fonction de sortie de texte pfOS() à laquelle Prolog soumettra toutes les sorties (prédicats, messages): avant l'installation d'une telle fonction, aucune sortie ne peut être visible. Le remplacement et la suppression de cette fonction fonctionnent comme la précédente.
Le format de cette fonction (type OutStringFunction défini dans le fichier des prototypes) est imposé: son unique argument est l'adresse d'un buffer contenant le texte à imprimer. Le code de retour de la fonction est ignoré: aucune erreur n'est attendue.
Intérieurement, la fonction peut effectuer toute opération même bloquante (en traitant les événements) nécessaire pour afficher le texte. Toutefois, on remarquera que Prolog peut émettre des lignes vides, et donc un filtrage peut
être nécessaire si par exemple des boîtes de messages sont utilisées.
© PrologIA
U 3 - 8
Manuel d'Utilisation Windows
InterruptProlog( )
Cette routine sans argument permet de déclencher une interruption utilisateur dans la session Prolog en cours d'exécution. Elle peut être invoquée à tout moment. L'exemple fourni avec la DLL en montre l'utilisation pour stopper l'exécution du prédicat Prolog enum.
A!ociation
Prolog
HERITAGE
© PrologIA

Lien public mis à jour
Le lien public vers votre chat a été mis à jour.
Caractéristiques clés
- Compilation incrémentale pour une vitesse optimisée.
- Modularité pour l'écriture de gros programmes.
- Ouverture vers d'autres langages (C, etc.).
- Récupération dynamique de mémoire (garbage collector).
- Débogueur de haut niveau intégré.
- Bibliothèque portable d'interface graphique.