Funktional-logische Programmierung © 2000 Prof. Dr. Rainer Manthey Kapitel 5.3 5.1 5.1 Reduktionsstrategien Reduktionsstrategienund und Spracherweiterungen Spracherweiterungen 5.2 5.2 Haskell Haskellund undandere anderewichtige wichtige funktionale funktionaleSprachen Sprachen 5.3 5.3 Funktional-logisches Funktional-logischesProgrammieren Programmieren Deskriptive Programmierung SS 2000 1 Integration funktionaler und logischer Programmierung • seit Mitte der 1980er Jahre: erste Versuche, Vorzüge beider deskriptiver "Sprachkulturen" in einer Sprache zu vereinigen • Übersichtsartikel über frühe Ansätze: Kapitel 5.3 M. M.Bellia, Bellia,G. G.Levi: Levi: "The "TheRelation Relationbetween betweenLogic Logicand andFunctional Functional Languages: Languages:AASurvey" Survey" Journal of Logic Journal of LogicProgramming Programming3,3,1986, 1986,217-236 217-236 • seit Anfang der 1990er Jahre: diverse konkrete Sprachentwürfe und Prototypsysteme, u.a. • LIFE (Ait-Kaci, Podelski/1993) • Escher (Lloyd/1995) • BABEL (Kuchen u.a./1996) • Curry (Hanus/1997) • RelFun (Boley/1999) © 2000 Prof. Dr. Rainer Manthey Deskriptive Programmierung SS 2000 2 FP/LP-Integration (2) • Kapitel 5.3 "modernerer" Übersichtsartikel: Michael MichaelHanus: Hanus: "The "TheIntegration IntegrationofofFunctions Functionsinto intoLogic LogicProgramming: Programming: From FromTheory TheorytotoPractice", Practice", Journal of Logic Programming Journal of Logic Programming19/20, 19/20,1994, 1994,583-628 583-628 • Einstiegsseite zur Funktional-Logischen Programmierung im Internet: http://www-i2.informatik.rwth-aachen.de/~hanus/FLP/ http://www-i2.informatik.rwth-aachen.de/~hanus/FLP/ • Webseiten einiger Prototypsprachen: • • • • LIFE Curry RelFun Babel © 2000 Prof. Dr. Rainer Manthey http://www.isg.sfu.ca/life/ http://www.informatik.uni-kiel.de/~curry/ http://www.dfki.uni-kl.de/~vega/relfun.html http://www-i2.informatik.rwth-aachen/babel/ Deskriptive Programmierung SS 2000 3 Grundzüge der FLP Kapitel 5.3 • wichtigste Spracherweiterungen in FLP gegenüber reiner FP: • Auswertung von Termen mit freien Variablen • nicht-deterministische Funktionen • freie Variablen in einem Redex: • zwei Ansätze zum Umgang mit derartigen Ausdrücken: • "rigid functions": Termauswertung wird solange verschoben ("delay"), bis Variable durch Auswertung eines anderen Ausdrucks gebunden wird (z.B. in Escher verwendet) • "flexible functions": • ff 00 == 22 ff 11 == 33 ff XX ?? Alle möglichen Antwortbindungen für die freie Variable werden generiert, in jedem dieser Fälle ggf. weiter reduziert und eine disjunktive Antwort ausgegeben (z.B. in Babel verwendet) in Curry: Wahl zwischen beiden Auswertungsformen, z.B.: ff eval flex eval flex © 2000 Prof. Dr. Rainer Manthey {x=0} {x=1} 33 {x=0} 22 | | {x=1} Deskriptive Programmierung SS 2000 4 Grundzüge der FLP (2) Kapitel 5.3 • zugehörige Operationalisierungstechniken: • "rigid functions": Residuation (heute kaum noch untersucht) • "flexible functions": Narrowing (viele Varianten vorgeschlagen, Näheres im Survey von Hanus) • nichtdeterministische Funktionen: "Funktionen", die keine eindeutigen Resultate mehr für gegebene Eingabekonstellation liefern • aus der Sicht der Logik keine Funktionen mehr ! • "Hybridkonzept" zwischen Funktion (Syntax) und Relation (Semantik) • nur sinnvoll in Kombination mit disjunktiven Antworten (Narrowing) choose choose xx yy choose choose xx yy == xx == yy choose choose1122 ?? 11 | | 22 © 2000 Prof. Dr. Rainer Manthey Deskriptive Programmierung SS 2000 5 Beispiel für "nicht-deterministische" Reduktion insert insert insert insert choose choose xx yy choose choose xx yy == xx == yy xx [[]] xx (y:ys) (y:ys) Kapitel 5.3 == == [[xx]] choose choose (x:y:ys) (x:y:ys) (y:insert (y:insert xxys) ys) permute permute [[]] permute permute (x:xs) (x:xs) == == [[]] insert insert xx (permute (permute xs) xs) permute permute [1, [1,2,2,3]3] ?? [1, [1,2,2,3]3] | | [2, [2,1,1,3]3] | | [2, [2,3,3,1]1] | | [1, [1,3,3,2]2] | | [3, [3,1,1,2]2] | | [3, [3,2,2,1]1] © 2000 Prof. Dr. Rainer Manthey Deskriptive Programmierung SS 2000 6 Narrowing • Kapitel 5.3 Kombination von nichtdeterministischen Funktionen und freien Variablen zeigt Ähnlichkeit von Narrowing und Paramodulation: append append [[]] ys ys append append (x:xs) (x:xs) ys ys == == ys ys xx: :append append xs xs ys ys freie Variable innerhalb eines = - Literals: Verwendung ohne freie Variablen: append append xx [2] [2] == [1, [1,2]2] ?? append append[1] [1] [2] [2] ?? x : append xs [2] = [1, 2] xs/[ ] [1, [1,2] 2] x : [2] = [1, 2] Gewinnung von Antwortsubstitutionen © 2000 Prof. Dr. Rainer Manthey Deskriptive Programmierung SS 2000 x/[1] true 7