Qi (langage)

Qi
Paradigmes fonctionnel, logique
Auteur Mark Tarver
Développeurs Mark Tarver et al.
Typage statique, dynamique
Influencé par Haskell, ML, Lisp, Prolog
Système d'exploitation Multi-plate-forme
Site web http://www.lambdassociates.org/

Qi est un langage de programmation fonctionnelle créé par Mark Tarver, introduit en et distribué sous licence GPL. Qi est écrit en Lisp. Il inclut la plupart des fonctionnalités communes à la programmation fonctionnelle : le filtrage, la curryfication, inférence de types, typage statique, typage dynamique, la garde et l'application partielle. Ce langage a remporté en 2003, le prix Promising Invention Award de l'Université d'État de New York.

La base du langage Qi

Par certains côtés, Qi se veut une simplification du langage Lisp. Les fonctions utilisent la notation préfixée.

Un programme qui affiche Hello World sur la sortie standard :

(output "Hello, world~%")

Les listes se construisent avec [ .... ] et les éléments sont séparés par un caractère d'espace.

[76 trombones]

La fonction factorielle définie en utilisant le filtrage :

(define factorial
  0 -> 1
  N -> (* N (factorial (- N 1))))

Une fonction anonyme qui multiplie par 2.

(/. X (* X 2))

Une fonction membre utilisant le filtrage sur les listes (Qi suit la syntaxe conventionnelle du Edinburgh Prolog pour le filtrage, sauf que des espaces sont utilisées au lieu de la virgule pour séparer les éléments).

(define member
 _ [] -> false
 X [X | _] -> true
 X [_ | Y] -> (member X Y))

Une fonction utilisant la garde qui cherche le premier nombre plus grand que N dans une liste.

(define find_greater
  N [] -> (error "no number greater than ~A.~%" N)
  N [M | _] -> M where (> M N)
  N [_ | Ns] -> (find_greater N Ns))

Qi Prolog

Qi Prolog est une version du langage Prolog mise en œuvre en Qi, en utilisant la syntaxe standard d'Edinburgh. Voici un exemple de base en Qi Prolog :

(defprolog
  "dog(snoopy).
   man(socrates).
   man(plato).
   mortal(X) :- man(X).")

Et pour interroger la base de connaissance Prolog :

(ask [ man plato ] )
(ask [ man snoopy ] )
(ask [ dog X ] )
(ask [ man M ] )

Liens externes