Comment utiliser le compilateur Prolog en ligne
- Écrivez vos faits et vos règles dans l'éditeur, ou partez de l'exemple avec Réinitialiser l'exemple.
- Indiquez quoi exécuter avec une directive
:- initialization(main)., oùmainest un prédicat qui appelle les buts que vous voulez essayer et affiche les résultats. - Cliquez sur Exécuter ou utilisez Ctrl + Entrée (⌘ + Entrée sur Mac). Le programme est chargé sous la forme du fichier
main.pl, et ses directives s'exécutent pendant le chargement. - Consultez le panneau Sortie pour le texte affiché, les erreurs et les avertissements. Choisissez une limite de temps de 5, 15 ou 60 secondes, et utilisez Arrêter si une récursion ne se termine jamais.
L'environnement d'exécution SWI-Prolog pèse environ 4 Mo et il est mis en cache par votre navigateur après la première visite. Conservez votre programme avec Copier ou le téléchargement de main.pl, redimensionnez le texte avec A− et A+, changez la disposition des panneaux avec le bouton de disposition, et utilisez Plein écran (Ctrl/⌘ + Maj + F, Échap pour quitter) pour les programmes plus longs.
Tout s'exécute dans votre navigateur. Le programme n'est jamais envoyé à un serveur, et l'éditeur n'enregistre votre dernière version que dans le stockage local de votre navigateur.
Ce qui est pris en charge
La page utilise SWI-Prolog 10 compilé en WebAssembly (swipl-wasm). C'est le véritable système SWI-Prolog, pas un interpréteur simplifié.
- Chargement d'un fichier : votre code est chargé exactement comme le ferait
consult('main.pl'), si bien que les clauses, les opérateurs et les directives fonctionnent tous. - Prédicats de sortie :
format/2,write/1,writeln/1,print/1etnl/0affichent tous dans le panneau de sortie. - Listes et prédicats de toutes les solutions :
member/2,append/3,length/2,msort/2,findall/3,bagof/3,setof/3,forall/2. - Arithmétique avec
is/2et les opérateurs de comparaison, sur des entiers et des flottants. Le20!de l'exemple est calculé exactement. - Diagnostics tels que SWI-Prolog les affiche, par exemple les avertissements de variable singleton et des erreurs comme
ERROR: ... Arithmetic: `foo/0' is not a function.
Ce qui diffère d'un Prolog de bureau :
- Il n'y a pas d'invite de requête
?-interactive : vous ne pouvez donc pas taper des requêtes et appuyer sur;pour obtenir d'autres réponses. Placez les requêtes dansmainet affichez les réponses, ou récupérez-les toutes avecfindall/3ouforall/2. - Pas d'entrée standard.
read/1n'a rien à lire : écrivez donc vos données de test sous forme de faits.
Les bases de Prolog en un programme
% Faits
likes(mary, wine).
likes(john, wine).
likes(john, mary).
% Une règle : X et Y sont amis si tous deux aiment la même chose
friends(X, Y) :- likes(X, Z), likes(Y, Z), X \== Y.
% Récursion sur une liste, avec un accumulateur
sum_list_acc([], Acc, Acc).
sum_list_acc([H|T], Acc0, Sum) :- Acc1 is Acc0 + H, sum_list_acc(T, Acc1, Sum).
% Le cut (!) s'engage sur la première clause qui correspond
max(X, Y, X) :- X >= Y, !.
max(_, Y, Y).
main :-
findall(X-Y, friends(X, Y), Pairs), writeln(Pairs),
sum_list_acc([1,2,3,4], 0, S), format("sum = ~w~n", [S]),
max(3, 7, M), format("max = ~w~n", [M]).
:- initialization(main).
L'exécution affiche [mary-john,john-mary], sum = 10 et max = 7.
Pièges courants
=est l'unification, pas une affectation ni un calcul.X = 1 + 2lieXau terme1+2. UtilisezX is 1 + 2pour l'évaluer, et=:=pour comparer deux nombres.- Les variables commencent par une majuscule ou par
_.nameest un atome etNameune variable : une faute de casse change donc silencieusement le sens d'une clause. - Les avertissements singleton signifient qu'une variable n'apparaît qu'une fois dans une clause, ce qui est généralement une faute de frappe. Renommez-la en
_ou_Namesi elle est inutilisée volontairement. - Utilisez le cut avec précaution. Le
max/3ci-dessus convient pourmax(3, 7, M), mais la deuxième clause dépend du cut, si bien quemax(5, 3, 3)réussit à tort. Écriremax(X, Y, Y) :- X < Y.comme deuxième clause le rend sûr. Un cut mal placé peut aussi masquer des solutions quefindallrenverrait autrement. - La récursion à gauche boucle. Une règle comme
ancestor(X, Y) :- ancestor(X, Z), parent(Z, Y).s'appelle récursivement à l'infini. Placez d'abord le butparent.
main échoue au lieu de réussir, SWI-Prolog affiche un avertissement indiquant que le but d'initialisation a échoué. Ajoutez des appels à writeln/1 entre les buts pour voir jusqu'où le programme va.Questions fréquentes
Comment exécuter une requête en Prolog ?
Écrivez-la dans un prédicat comme main et ajoutez :- initialization(main). à la fin du fichier. Vous pouvez aussi placer un but directement dans une directive, par exemple :- X is 2^10, writeln(X).
Est-ce du Prolog standard ?
C'est SWI-Prolog, qui suit la norme ISO et y ajoute de nombreuses extensions. Un texte entre guillemets doubles est une chaîne dans SWI-Prolog, ce qui compte si vous avez l'habitude qu'il désigne une liste de codes de caractères.
Puis-je obtenir toutes les réponses à une requête ?
Oui. Utilisez findall/3 pour les collecter dans une liste, ou forall/2 pour afficher chacune d'elles, comme le fait le programme d'exemple.
D'autres langages logiques ou fonctionnels sont-ils disponibles ?
Essayez l'Interpréteur Scheme en ligne ou le Compilateur Clojure en ligne, ou consultez tous les compilateurs en ligne.
Mis à jour
Commentaires
Connectez-vous pour noter cet outil.
Partagez une astuce, posez une question ou racontez comment l’outil a fonctionné pour vous.
Aucun commentaire pour l’instant. Soyez le premier à raconter votre expérience.