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.