Einschränkungsprogrammierung

Einschränkungsprogrammierung ist ein Programmierparadigma, worin Beziehungen zwischen Variablen in der Form von Einschränkungen festgesetzt werden. Einschränkungen unterscheiden sich von den allgemeinen Primitiven von befehlenden Programmiersprachen darin sie geben keinen Schritt oder Folge von Schritten an durchzuführen, aber eher die Eigenschaften einer Lösung, gefunden zu werden. Das macht Einschränkung, eine Form der Aussageprogrammierung programmierend. Die in der Einschränkungsprogrammierung verwendeten Einschränkungen sind verschiedener Arten: Jene haben in Einschränkungsbefriedigungsproblemen verwendet (z.B "A, oder B ist wahr"), diejenigen, die durch den Simplexalgorithmus gelöst sind (z.B "≤ 5"), und andere. Einschränkungen werden gewöhnlich innerhalb einer Programmiersprache eingebettet oder über getrennte Softwarebibliotheken zur Verfügung gestellt.

Einschränkungsprogrammierung kann in der Form der Einschränkungslogikprogrammierung getan werden, die Einschränkungen in ein Logikprogramm einbettet. Diese Variante der Logikprogrammierung ist wegen Jaffars und Lassez, der 1987 eine spezifische Klasse von Einschränkungen erweitert hat, die in der Einleitung II eingeführt wurden. Die ersten Durchführungen der Einschränkungslogikprogrammierung waren Einleitung III, CLP(R) und SPAN.

Anders als Logikprogrammierung können Einschränkungen mit der funktionellen Programmierung, dem Begriff-Neuschreiben und den befehlenden Sprachen gemischt werden.

Programmiersprachen mit der eingebauten Unterstützung für Einschränkungen schließen Oz (funktionelle Programmierung) und Kaleidoskop (Befehlsform-Programmierung) ein. Größtenteils werden Einschränkungen auf befehlenden Sprachen über Einschränkungslösen-Werkzeuge durchgeführt, die getrennte Bibliotheken für eine vorhandene befehlende Sprache sind.

Einschränkungslogikprogrammierung

Einschränkungsprogrammierung ist ein Einbetten von Einschränkungen auf einer Gastgeber-Sprache. Die ersten verwendeten Gastgeber-Sprachen waren Logikprogrammiersprachen, so wurde das Feld Einschränkungslogikprogrammierung am Anfang genannt. Die zwei Paradigmen teilen viele wichtige Eigenschaften, wie logische Variablen und das Zurückverfolgen. Heute schließen die meisten Einleitungsdurchführungen eine oder mehr Bibliotheken für die Einschränkungslogikprogrammierung ein.

Der Unterschied zwischen den zwei ist größtenteils in ihren Stilen und Annäherungen an das Modellieren der Welt. Einige Probleme sind (und so natürlicher, einfacher), als Logikprogramme zu schreiben, während einige natürlicher sind, um als Einschränkungsprogramme zu schreiben.

Die Einschränkungsprogrammierannäherung soll nach einem Staat der Welt suchen, in der eine Vielzahl von Einschränkungen zur gleichen Zeit zufrieden sind. Ein Problem wird normalerweise als ein Staat der Welt festgesetzt, die mehrere unbekannte Variablen enthält. Das Einschränkungsprogramm sucht nach Werten nach allen Variablen.

Zeitliche gleichzeitige Einschränkung (TCC) und nichtdeterministische zeitliche gleichzeitige Einschränkung programmierend (NTCC) programmierend, sind Varianten der Einschränkung programmierend, der sich mit Zeit befassen kann.

Einige populäre Einschränkungslogiksprachen sind:

  • B-Einleitung (Einleitung gestützt, Eigentums-)
  • SPAN-V5 (Einleitung gestützt, schließt auch C ++ und C Bibliotheken, Eigentums-ein)
  • Ciao (Einleitung gestützt, Kostenlose Software: GPL/LGPL)
  • ECLiPSe (Gestützte Einleitung, öffnen Sie Quelle)
  • SICStus (Einleitung gestützt, Eigentums-)
  • GNU-Einleitung (kostenlose Software)
  • Unze
  • KLÄFFEN-Einleitung
  • SWI Einleitung ein freies Einleitungssystem, das mehrere Bibliotheken für die Einschränkung enthält, lösend
  • Claire
  • Curry (Haskell gestützt, mit freien Durchführungen)

Gebiete

Die in der Einschränkungsprogrammierung verwendeten Einschränkungen sind normalerweise über einige spezifische Gebiete. Einige populäre Gebiete für die Einschränkungsprogrammierung sind:

  • Boolean-Gebiete, wo nur wahre/falsche Einschränkungen (GESESSENES Problem) gelten
  • Gebiete der ganzen Zahl, vernünftige Gebiete
  • geradlinige Gebiete, wo nur geradlinige Funktionen beschrieben und analysiert werden (obwohl Annäherungen an nichtlineare Probleme wirklich bestehen)
  • Gebiete, wo Einschränkungen über begrenzte Sätze definiert werden
  • Mischgebiete, zwei oder mehr des obengenannten einschließend

Begrenzte Gebiete sind eines der erfolgreichsten Gebiete der Einschränkungsprogrammierung. In einigen Gebieten (wie Operationsforschung) wird Einschränkungsprogrammierung häufig mit der Einschränkungsprogrammierung über begrenzte Gebiete identifiziert.

Alle obengenannten Beispiele werden durch satisfiability modulo Theorien (SMT) solvers allgemein gelöst.

Begrenztes Gebiet solvers ist nützlich, um Einschränkungsbefriedigungsprobleme zu beheben, und basiert häufig auf der Kreisbogen-Konsistenz oder einer seiner Annäherungen.

Die Syntax, um Einschränkungen über begrenzte Gebiete auszudrücken, hängt von der Gastgeber-Sprache ab. Der folgende ist ein Einleitungsprogramm, das das klassische Alphametic-Rätsel SEND+MORE=MONEY in der Einschränkungslogikprogrammierung löst:

sendmore (Ziffern): -

Ziffern = [S, E, N, D, M, O, R, Y], Schafft % Variablen

Ziffern:: [0.. 9], %-Mitgebiete zu Variablen

S # \= 0, %-Einschränkung: S muss von 0 verschieden

sein

M # \= 0,

alldifferent (Ziffern) % müssen alle Elemente verschiedene Werte nehmen

1000*S + 100*E + 10*N + D % Andere Einschränkungen

+ 1000*M + 100*O + 10*R + E

#= 10000*M + 1000*O + 100*N + 10*E + Y,

das Beschriften (von Ziffern). %-Anfang die Suche

Der Dolmetscher schafft eine Variable für jeden Brief im Rätsel. Das Symbol wird verwendet, um die Gebiete dieser Variablen anzugeben, so dass sie sich über den Satz von Werten {0,1,2,3..., 9} erstrecken. Die Einschränkungen und Mittel, dass diese zwei Variablen die Wertnull nicht nehmen können. Wenn der Dolmetscher diese Einschränkungen bewertet, reduziert es die Gebiete dieser zwei Variablen durch das Entfernen des Werts 0 von ihnen. Dann wird die Einschränkung betrachtet; es reduziert kein Gebiet, so wird es einfach versorgt. Die letzte Einschränkung gibt an, dass die den Briefen zugeteilten Ziffern solch sein müssen, dass "SEND+MORE=MONEY" hält, wenn jeder Brief durch seine entsprechende Ziffer ersetzt wird. Von dieser Einschränkung leitet der solver das M=1 ab. Alle versorgten Einschränkungen, die mit variabler M verbunden sind, werden erweckt: In diesem Fall entfernt die Einschränkungsfortpflanzung auf der Einschränkung Wert 1 vom Gebiet aller restlichen Variablen. Einschränkungsfortpflanzung kann das Problem durch das Reduzieren aller Gebiete auf einen einzelnen Wert beheben, es kann beweisen, dass das Problem keine Lösung durch das Reduzieren eines Gebiets auf den leeren Satz hat, aber auch enden kann, ohne satisfiability oder unsatisfiability zu beweisen. Die Beschriften-Druckfehler werden verwendet, um wirklich Suche nach einer Lösung durchzuführen.

Einschränkungsprogrammierbibliotheken für befehlende Programmiersprachen

Einschränkungsprogrammierung wird häufig in der befehlenden Programmierung über eine getrennte Bibliothek begriffen. Einige populäre Bibliotheken für die Einschränkungsprogrammierung sind:

Einige Sprachen diese Unterstützungseinschränkungsprogrammierung

  • Alma-0 ein kleiner, stark getippt, die Einschränkungssprache mit einer begrenzten Zahl von Eigenschaften durch die Logikprogrammierung begeistert, befehlende Programmierung unterstützend.
  • Bertrand eine Sprache, um Einschränkungsprogrammiersysteme zu bauen.
  • Das allgemeine Lispeln über die Riesenschlagzeile (eine Bibliothek der kostenlosen Software, die das Zurückverfolgen und CLP(R), die Eigenschaften von CHiP zur Verfügung stellt).

Siehe auch

  • Kombinatorische Optimierung
  • Einschränkungsbefriedigung
  • Einschränkungslogik, die programmiert
  • Heuristische Algorithmen
  • Mathematische Programmierung (Optimierungstheorie)
  • Krankenschwester, die Problem plant
  • Concurrent Constraint Programming (CCP)

Links


Agricola / Hampstead, Quebec
Impressum & Datenschutz