Picat ist eine logikbasierte, multiparadigmatische Programmiersprache von Neng-Fa Zhou (City University of New York), die erstmals 2013 veröffentlicht wurde. Sie verbindet Logikprogrammierung, funktionale Programmierung, Constraint Solving, dynamische Programmierung mit Tabling und Skripting — speziell entworfen für kombinatorische Suchprobleme und Planung.
Start und REPL
picat # interaktive REPL starten
picat programm.pi # Skript ausführen
Constraint Solving: CP, SAT und MIP
Picat bietet eine gemeinsame Schnittstelle zu drei Solver-Modulen — CP (Constraint Programming), SAT (Boolesche Erfüllbarkeit) und MIP (Mixed Integer Programming). Derselbe Code kann durch einfaches Umschalten des Moduls mit verschiedenen Lösern laufen:
import cp.
main =>
Vars = [X, Y],
Vars :: 1..10,
X + Y #= 12,
solve(Vars),
writeln(Vars).
Die Direktiven import cp., import sat. bzw. import mip. wählen das Solver-Modul; #= ist das Gleichheits-Constraint, :: legt die Domäne fest, solve sucht eine Lösung.
Tabling und Planung
Die table-Direktive speichert Zwischenergebnisse von Prädikaten (Memoization) und macht dynamische Programmierung natürlich — so lassen sich z.B. Fibonacci-Folgen oder kürzeste Pfade ohne explizite Schleifen formulieren. Das integrierte planner-Modul löst Planungsaufgaben mit heuristischer Suche und dem best_plan-Prädikat.
Sprachmittel
- Funktionen und Prädikate gleichberechtigt (funktional-logische Programmierung)
- Pattern-Matching und List-Comprehensions
- Strukturen, Arrays, Maps und Pools für Datensammlungen
- Strikte Typprüfung optional
Verwandte Grundlagen: Answer-Set-Programming-Befehle, Clingo-Befehle, Prolog-Befehle.