2013-03-18 2 views
7

Werden Hilog-Ausdrücke (d. H. Verbindungen mit als Funktoren beliebigen Termen) immer noch als mächtiges Merkmal in XSB Prolog (oder einem anderen Prolog) betrachtet? Gibt es viele XSB-Projekte, die diese Funktion derzeit nutzen? Welches von ihnen zum Beispiel?Hilog-Ausdrücke in (XSB) Prolog

Ich frage, da, soweit ich verstehe, Programmierung höherer Ordnung ist gleichermaßen möglich mit dem ISO-integrierten Anruf/N.

Ich würde gerne verstehen, ob XSB Hilog-Begriffe nur aus historischen Gründen verwendet oder ob Hilog-Begriffe im Vergleich zum aktuellen ISO-Standard erhebliche Vorteile haben.

Antwort

5

Innerhalb von XSB sind Hilog-Begriffe sehr eng mit dem XSB-spezifischen Modulsystem verbunden. XSB hat ein funktorbasiertes Modulsystem. Das heißt, innerhalb desselben Bereichs könnte length(X) zu einem Modul gehören, während length(L, N) zu einem anderen gehören könnte. Als Folge call(length(L), N) zu einem Modul und call(length(L, N)) zum anderen beziehen könnten:

[Patch date: 2013/02/20 06:17:59] 
| ?- use_module(basics,length/2). 
yes 
| ?- length(Xs,2).    
Xs = [_h201,_h203] 
yes 
| ?- call(length(Xs),2). 
Xs = [_h217,_h219] 
yes 
| ?- use_module(inex,length/1). 
yes 
| ?- length(Xs,2). 
Xs = [_h201,_h203] 
yes 
| ?- call(length(Xs),2). 
++Error[XSB/Runtime/P]: [Existence (No module inex exists)] in arg 1 of predicate load 
| ?- call(call(length,Xs),2). 
Xs = [_h228,_h230]; 

Es könnte sein, dass in einem solchen Zusammenhang gibt es Unterschiede zwischen call/N und Hilog Bedingungen. Ich habe jedoch bisher keinen gefunden.

Historisch wurden Hilog Begriffe 1987-1989 eingeführt. Zu diesem Zeitpunkt existierten call/N bereits als Einbauten in NU und als library(call) in Quintus Prolog mit only cursory documentation. Es wurde 1984 by Richard O'Keefe vorgeschlagen. Auf der anderen Seite war call/N den Autoren von Hilog, wie auf S. 1101 von Weidong Chen, Michael Kifer, David Scott Warren, beispielhaft beschrieben, eindeutig: HiLog: A First-Order Semantik für Logik-Programmierkonstrukte höherer Ordnung. NACLP 1989. 1090-1114. MIT-Drücken.

... Generic transitive Hülle kann auch in Prolog definiert werden:

closure(R, X, Y) :- C =.. [R, X, Y], call(C). 
    closure(R, X, Y) :- C =.. [R, X, Z], call(C), closure(R, Z, Y). 

Dies ist jedoch offensichtlich unelegant ist im Vergleich zu HiLog (siehe Abschnitt 2.1), da dies sowohl beinhaltet einen Begriff aus der Konstruktion von eine Liste und diesen Begriff in eine atomare Formel mit "Anruf" widerspiegeln. Der Punkt dieses Beispiels ist, dass das Fehlen von theoretischen Grundlagen für Konstrukte höherer Ordnung in Prolog zu einer obskuren Syntax führte, was teilweise erklärt, warum Prolog-Programme, die solche Konstrukte beinhalten, notorisch schwer zu verstehen sind.

Nun, kann dies mit call/N wie so geschehen:

closure(R, X, Y) :- call(R, X, Y). 
closure(R, X, Y) :- call(R, X, Z), closure(R, Z, Y). 

die noch allgemeiner als die (=..)/2 -Version weil R ist beschränkt sich nicht mehr auf ein Atom zu sein. Nebenbei möchte ich lieber schreiben:

closure(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X). 

closure0(_R_2, X,X). 
closure0(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X).