DE69023196T2 - Implizite Prologargumente. - Google Patents

Implizite Prologargumente.

Info

Publication number
DE69023196T2
DE69023196T2 DE69023196T DE69023196T DE69023196T2 DE 69023196 T2 DE69023196 T2 DE 69023196T2 DE 69023196 T DE69023196 T DE 69023196T DE 69023196 T DE69023196 T DE 69023196T DE 69023196 T2 DE69023196 T2 DE 69023196T2
Authority
DE
Germany
Prior art keywords
prolog
instruction
predicate
stack
instructions
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
DE69023196T
Other languages
English (en)
Other versions
DE69023196D1 (de
Inventor
Marc Jean Louis Gillet
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Application granted granted Critical
Publication of DE69023196D1 publication Critical patent/DE69023196D1/de
Publication of DE69023196T2 publication Critical patent/DE69023196T2/de
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • G06F9/3016Decoding the operand specifier, e.g. specifier format
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4496Unification in logic programming

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

    Bereich der Erfindung
  • Diese Erfindung bezieht sich im allgemeinen auf Verbesserungen in einem Prolog-Interpretierer und insbesondere auf eine Technik zum Codieren von Prologbefehlen ohne explizite Argumente, um die Geschwindigkeit, mit welcher ein Interpretierer die Befehle decodieren kann, zu erhöhen und so die Gesamtleistung eines Prolog-Interpretierers zu verbessern.
  • Beschreibung der Erfindung
  • Diese Erfindung ist eine aus einer Reihe von Verbesserungen, die gemacht wurden, um IBM's Prolog für den 370 zu entwickeln. Wie der Name sagt, wurde der Kompilierer für die Umgebung des IBM's 370/XA optimiert. Die Erfindung kann jedoch genauso gut in jeder anderen 32-Bit-Architektur eingesetzt werden. Die Erfindung könnte zum Beispiel in einem Intel 80X86 Prozessor oder in einem Motorola 680X0 praktisch genutzt werden.
  • Der erste Prolog-Interpretierer wurde 1972 von Phillipe Roussel in Frankreich entwickelt. Seine frühe Arbeit wurde an der Universität von Waterloo, Kanada, weiterentwickelt und zum ersten Mal in einein IBM S/370 eingesetzt. Eine ausführliche Zusammenfassung der Geschichte und des Inhalts der Sprache in Prolog ist in einem Bericht von David H.D. Warren, "Implementing Prolog", DAI Research Report No. 39 (May 1977) enthalten.
  • In seinem Bericht beschreibt Herr Warren die beiden Grundelemente der Sprache in Prolog: logische Anweisungen, bekannt als Horn-Klauseln und eine Kontrollsprache, die von dem Programmierer zum Aufbau eines Beweises benutzt wird. In Kapitel 4.1 wird die Syntax in Prolog und die Terminologie beschrieben, die zum Verständnis dieser Erfindung als Basis dient. Die Sprache wird in formellen Beweisen erstellt. So wird zum Beispiel P E Q & R & S als P interpretiert, wenn Q und R und S ist. Sorgfältiges Lesen von Kapitel 4.1 wird dem uneingeweihten Leser helfen, die Syntax in Prolog zu verstehen und sich mit den wichtigsten Befehlen vertraut zu machen.
  • Die Befehle Prolog enthalten: Hol-, Ablege-, Unifizierungs-, Prozedur- und Indizierungsanweisungen. Eine ausführliche Zusammenfassung des Befehlssatzes in Prolog wird in einem anderen Artikel mit dem Titel AN ABSTRACT PROLOG INSTRUCTION SET, Technical Note 309, SRI Project 4776 (October 1983) von Herrn Warren beschrieben. In dem Artikel von Herrn Warren wird die klassische Prologsyntax beschrieben, die als Standard in allen Kompilierern/Interpretierern in Prolog akzeptiert wird. Eine weitere Erläuterung zur Prologsprache wird in A TUTORIAL ON THE WARREN ABSTRACT MACHINE FOR COMPUTATIONAL LOGIC, Gabriel et al., Argonne National Laboratory (June 1985) geliefert.
  • Das klassische System in Prolog wird zu Ehren seines Erfinders Warren Abstract Machine (WAM) genannt. Die Architektur des WAM wird von Herrn Warren in An Abstract Prolog Instruction Set beschrieben. Die Erfindung ist eine Verbesserung des WAM's, um einige der Probleme anzugehen, die Herr Warren versäumt hat, anzugehen.
  • Eine jüngste US Patentschrift 4,546,432 von NEC mit dem Titel Prolog Processing System erörtert ein effizientes Verfahren zur Verwaltung der Register, die zu den verschiedenen Stapelspeichern in Prolog gehören. Die Patentschrift versäumt jedoch, ein Verfahren zu beschreiben, mit dem der Adreßraum in Prolog vergrößert und die Gesamtleistung verbessert werden kann, indem die Zeiger effektiver verwaltet werden.
  • Wie zuvor erwähnt, lehrt kein Stand der Technik eine Technik, um implizite Argumente in einem optimierten Prolog-Interpretierer auszuführen.
  • ZUSAMMENFASBUNG DER ERFINDUNG
  • Die vorliegende Erfindung wird in den beiliegenden Ansprüchen definiert.
  • Gemäß der Erfindung werden Verbesserungen in einem Prolog-Interpretierer erreicht, indem die Standard-Befehlsbearbeitungsobjekte in Prolog, zum Beispiel ein Atom, durch alternierende Darstellungen der Objekte ersetzt werden. Die anderen Informationen, die zuvor in dem Stand der Technik des WAM Befehls, wie ein Registerfeld und ein cod_op Feld, explizit codiert wurden, werden von dem Interpretierer verwaltet. Der Interpretierer verfolgt die Aufzeichnung von Berechnungen, die eine Finite-Status-Automatisierung mittels 4 Entscheidungstabellen benutzen. Diese Verarbeitung liefert extrem schnelle Decodierung des abstrakten Befehls, welche positiv auf den Interpretierer wirkt. Durch die Verbesserung entfällt der vorherige, signifikante Aufwand, der mit den Decodierbefehlen verbunden ist, die im Stand der Technik von Prolog-Interpretierern gefunden wurden.
  • KURZBESCHREIBUNG DER ZEICHNUNGEN
  • Vorgenannte und weitere Objekte, Aspekte und Vorteile der Erfindung werden besser anhand der folgenden, ausführlichen Beschreibung des bevorzugten Ausführungsbeispiels der Erfindung mit Bezug auf die beiliegenden Zeichnungen verstanden, in denen
  • Figur 1 einen Stand der Technik eines Satzes in Prolog zeigt, der ein Objekt darstellt;
  • Figur 2 ein Prolog Wort in der Art eines Zeigers gemäß der vorliegenden Erfindung zeigt;
  • Figur 3 ein Prolog Wort in der Art eines Deskriptors gemäß der vorliegenden Erfindung darstellt;
  • Figur 4 ein Flußdiagramm eines klassischen Stands der Technik als Annäherung an die Objektverarbeitung in Prolog zeigt;
  • Figur 5 ein Flußdiagramm der Objektverarbeitung in Prolog gemäß der beiliegenden Erfindung zeigt;
  • Figur 6 eine Darstellung in Prolog einer freien Variablen gemäß der vorliegenden Erfindung zeigt;
  • Figur 7 eine Konstante in Prolog gemäß der vorliegenden Erfindung darstellt;
  • Figur 8 einen Rahmen in Prolog gemäß der vorliegenden Erfindung zeigt;
  • Figur 9 einen Stand der Technik eines get_constant Befehls in Prolog zeigt;
  • Figur 10 einen get_constant Befehl in Prolog gemäß der vorliegenden Erfindung zeigt;
  • Figur 11 einen Stand der Technik eines put_constant Befehls in Prolog zeigt;
  • Figur 12 einen put_constant Befehl in Prolog gemäß der vorliegenden Erfindung zeigt;
  • Figuren 13A - 13C ein Flußdiagramm zeigen, das die Logik der Befehlsverarbeitung gemäß der vorliegenden Erfindung darstellt;
  • Figur 14 eine Darstellung einer Datenstruktur ist, die in einer Unterbrechungsverarbeitung gemäß der vorliegenden Erfindung benutzt wird;
  • Figuren 15A - 15F ein Blockdiagramm darstellen, das die Logik zeigt, die zu der zusätzlichen Unterbrechungsverarbeitung in Prolog gemäß des Gegenstands der Erfindung gehört;
  • Figur 16 eine Korrelationstabelle von Datenarten in verschiedenen Sprachen gemäß der vorliegenden Erfindung zeigt;
  • Figur 17 eine Ursprungsliste eines C Programms gemäß der vorliegenden Erfindung zeigt;
  • Figur 18 eine Ursprungsliste der Proargs in Prolog gemäß der vorliegenden Erfindung zeigt;
  • Figur 19 eine Assemblierer-Ursprungsliste der binären Deskriptor-Formate gemäß der vorliegenden Erfindung zeigt;
  • Figur 20 eine FORTRAN-Ursprungsliste des Hauptprogramms gemäß der vorliegenden Erfindung zeigt;
  • Figur 21 eine FORTRAN-Ursprungsliste einer Musterfunktion gemäß der vorliegenden Erfindung ist;
  • Figur 22 die Erklärung in Prolog der FORTRAN-Funktion STUPID gemäß der vorliegenden Erfindung zeigt;
  • Figur 23 eine Auflistung der Ausführung der FORTRAN-Funktion STUPID gemäß der vorliegenden Erfindung zeigt;
  • Figur 24 ein Beispiel von Deskriptor-Erklärungen gemäß der vorliegenden Erfindung zeigt;
  • Figur 25 ein Beispiel einer Deskriptor-Datei gemäß der vorliegenden Erfindung zeigt;
  • Figur 26 ein Beispiel von Ausdrücken gemäß der vorliegenden Erfindung zeigt;
  • Figur 27 ein Beispiel eines C Programms gemäß der vorliegenden Erfindung zeigt;
  • Figur 28 ein Beispiel von Prolog in der C Einfügedatei gemäß der vorliegenden Erfindung ist;
  • Figur 29 ein Beispiel des C Codes ist, der im C Hauptprogramm gemäß der vorliegenden Erfindung erforderlich ist;
  • Figur 30 eine Auflistung der C Textdatei für die CPLINK Funktion gemäß der vorliegenden Erfindung zeigt;
  • Figur 31 eine Auflistung der C Version von STUPID gemäß der vorliegenden Erfindung ist;
  • Figur 32 eine Auflistung der C Ausführung von STUPID gemäß der vorliegenden Erfindung ist;
  • Figur 33 ein Beispiel von FORTRAN in einer Schnittstelle in Prolog gemäß der vorliegenden Erfindung zeigt;
  • Figur 34 ein Beispiel von C in einer Schnittstelle in Prolog gemäß der vorliegenden Erfindung zeigt;
  • Figur 35 ein Beispiel von COBOL in einer Schnittstelle in Prolog gemäß der vorliegenden Erfindung zeigt.
  • Figuren 36A - 36C Flußdiagramme sind, welche die Logik der Kommunikation in Prolog mit externen Prozessen gemäß dem Gegenstand der Erfindung zeigen; und
  • Figuren 37A - 37C Flußdiagramme sind, welche die Logik der externen Prozeßkommunikation in Prolog gemäß dem Gegenstand der Erfindung zeigen.
  • Ausführliche Beschreibung der Erfindung Basis-Architektur in Prolog
  • Prolog ist auf vier Basis-Prozessen aufgebaut:
  • 1) rekursive Prozeduraufrufe, 2) Unifizierung, 3) Zurückverfolgung und 4) Cut-Operation. Die Rekursion erfordert die richtige Stapelspeicherverwaltung, um effektiv zu funktionieren. Die Unifizierung ist ein leistungsfähiges Datenverarbeitungsverfahren, das sowohl Vergleichs- als auch Zuordnungsbefehle, die in konventionellen Programmiersprachen gefunden werden, enthält. Die Unifizierung ist von einer effizienten Datenstrukturverarbeitung abhangig. Dies bedeutet eine Abhängigkeit von Zeigern, d.h. daß jede Verbesserung in der Zeigerverwaltung in eine verbesserte Ausführung umgesetzt wird.
  • Die Zurückverfolgung liefert die Wiederherstellung einer vorherigen Rechenumgebung. Die Zurückverfolgung ist der Programmkontextsicherung und -wiederherstellung ähnlich, die erfolgt, wenn eine Unterbrechung von einem typischen Betriebssystem verarbeitet wird. Das Zurückverfolgen erfordert die effiziente Verwaltung von Datenstrukturen, um Systemintegrität und Leistung in Prolog aufrechtzuerhalten. Die Zurückverfolgung wird im allgemeinen implementiert, indem eine Liste mit aktuellen Änderungen behalten wird. Die Ausführung der Zurückverfolgung besteht darin, diese Änderungen ungeschehen zu machen. Eine ähnliche Funktion in der Zurückverfolgungsoperation in Prolog in einer relationalen Datenbasisumgebung ist das "Wiederholen" einer relationalen Datenbasis. Der Cut-Operator schreibt die Verarbeitung in Prolog in allen Berechnungen fest, die bis zum Auftreten des Cut-Operators durchgeführt wurden.
  • Ein System in Prolog ist in eine Vielzahl von Datenbereichen aufgeteilt. Der erste ist der Codebereich. Dabei handelt es sich um einen Nur-Lesebereich, der die Programmbefehle und Literalen enthält. Die drei größeren schreibfähigen Datenbereiche der Maschine sind der lokale Stapelspeicher, der globale Speicher oder Freispeicher und der Trail-Stapelspeicher. Diese drei Stapelspeicher werden als Speicherbereich für globale und lokale Variablen und zur Systemwiederherstellung in Prolog benutzt. Globale Variablen sind Langzeitvariablen, die von dem Benutzer definiert werden und solange aktiv bleiben, bis die Verarbeitung beendet ist oder die Zurückverfolgung und/oder die Speicherbereinigung den Raum für Prolog zurückholen. Lokale Variablen werden als temporäre Speicherzellen benutzt, um Informationen von einem Ziel zum anderen zu übertragen. Der Raum kann ohne weiteres aus dem lokalen Stapelspeicher wiederhergestellt werden, wenn ein Ziel vollständig ist und keine Alternativen übrigbleiben. Die Manipulation des Stapelspeichers erfordert eine effiziente Verwaltung der Zeiger.
  • Der andere schreibfähige Bereich ist ein Last-In First-Out (LIFO) Kellerspeicher, Trail genannt. Der Trail wird benutzt, um die Adressen der variablen Zellen, welche das Zurücksetzen auf UNDEF beim Auftreten der Zurückverfolgung erforderlich machen, zu speichern. Der Trail wächst im Verhältnis zur Anzahl der Ziele. Die Trailgröße wird durch die Zurückverfolgung verringert. Register werden verwendet, um die zahlreichen Stapelzeiger zu verwalten, die für jeden der Stapelspeicher einzigartig sind. Der Bericht von Herrn Warren erörtert die klassische Systemverwaltung in Prolog von den verschiedenen Stapelspeichern und von ihren zugehörigen Registerzeigern.
  • Speicherbereinigung
  • Die Speicherbereinigung ist der Prozeß, mit dem der Stapelspeicherraum komprimiert, neu dargestellt und an das Prolog- System zurückgegeben wird, um die weitere Verarbeitung zu erleichtem.
  • Moderne Interpretierer und Kompilierer in Prolog verfolgen ihre Ursprünge in der Originalarbeit von Herrn Warren und in den Verbesserungen, die er in einem klassischen Standard für ein Prolog-System eingeführt und integriert hat.
  • Befehlssatz
  • Der Bericht von Herrn Warren erörtert die Befehle und deren Syntax und illustriert den assemblierten Code, der von den Anweisungen in Prolog erzeugt wurde. Die Beschreibung des bevorzugten Ausführungsbeispiels weicht von dem unvollständigen, optimierten Code ab, der in dem Bericht von Herrn Warren beschrieben wurde. Wie in dem Bericht hervorgehoben wird, erforderte der Warren Prolog Kompilierer zur Erfassung der Information eine indirekte Adressierung. Somit muß ein separates Register als Indexregister benutzt werden und die Information aus dem Befehl dient als Relativzeiger. Der Relativzeiger wird zum Indexregister hinzugefügt, um die effektive Adresse zu erhalten.
  • Die Befehle in Prolog werden zur Implementierung der Programme in Prolog benutzt. Im allgemeinen gibt es keine Eins-zu-Eins- Übereinstimmung der Befehle und der Prolog-Symbole in einer klassischen Prolog Abstract Machine. Ein typischer Befehl in Prolog besteht aus einem Operationscode (opcode) mit einer Vielzahl von Operanden. Der Opcode korreliert die Art des Prolog-Symbols mit dem Kontext, in dem dieses auftritt. Der Opcode belegt acht Bits oder ein Byte. Die Operanden enthalten kleine Ganzzahlen, Relativzeiger und Adressen. Diese Operanden entsprechen ihrerseits den verschiedenen Prolog-Symbolen. Abhängig von der spezifischen Implementierung in Prolog können die Operanden ein Halbbyte, ein Byte, ein Wort oder Doppelwort belegen.
  • Datenobjekte
  • Mit Bezug auf Figur 1 wird ein Stand der Technik eines Datenobjektes in Prolog dargestellt. Dieses wird durch ein Feldkennzeichen 10 und eine Adresse 20 dargestellt. Das typische Datenobjekt belegt zweiunddreißig Bits. Das Feldkennzeichen unterscheidet die Art des Begriffs und muß wenigstens zwei Bits und im allgemeinen acht Bits oder ein Byte haben. Die Hauptarten sind Referenzen, Listen, Strukturen, Rahmen, Atome und Ganzzahlen. Das Feldkennzeichen mit acht Bit läßt nur vierundzwanzig Bits an Adressierbarkeit. Dadurch ist zum Beispiel in der 370/XA Umgebung die völlige Nutzung des Adreßraums mit einunddreißig Bits nicht möglich.
  • Im Gegensatz zu FORTRAN, PL/1, COBOL, C und ähnlichen, die von Daten, die Variablen und Zuordnung von Werten zu den Variablen kennen, kenn Lisp und Prolog von Daten die Variablen und die Bindung. Variablen sind entweder frei (kein Wert) oder gebunden (oder festgehalten). Sobald jedoch eine Variable in Prolog festgehalten ist, kann die Variable nicht wieder festgehalten werden; es sei denn, die Variable ist ungebunden (durch Zurückverfolgung).
  • Dieser wesentliche Unterschied wird durch den Mustervergleich von Prolog ausgenutzt. Zum Beispiel in einer Operation von A = B, wo A und B Objekte (möglicherweise Variablen) in Prolog sind, wird versucht, A und B zu unifizieren. Wenn A und B Variablen sind, dann werden die 2 Variablen äquivalent, und die Unifizierung gelingt. Wenn A oder B eine Variable ist, dann wird die Variable gebunden (auf dem anderen Wert festgehalten), und die Unifizierung gelingt. Wenn sowohl A als auch B Daten sind, erfolgt der Mustervergleich, um die gleichen zu finden, indem die Variablen in A und/oder B möglicherweise rekursiv unifiziert werden. Wenn dies geschieht, dann gelingt die Unifizierung, andernfalls scheitert diese und es erfolgt eine Zurückverfolgung.
  • Dies erklärt, warum die Prolog Klausel X = 1 eine Darstellung ist, die X an 1 bindet, wenn X eine ungebundene Variable ist oder prüft, ob X gleich 1 ist, wenn X gebunden ist. A = B wird intern von dem Prolog-System durchgeführt, indem ein Zeiger auf A in B gesetzt wird. B = C wird erreicht, indem ein Zeiger auf B in C gespeichert wird. C = hello wird abgeschlossen, indem die Adresse des Atoms "hello" in C geschrieben wird. Um den Wert von B zu erhalten, muß der Wert der beiden Zeiger aufgelöst werden. Die Nutzung der Zeiger erfüllt diese Schritte wie diese ebenfalls die Verarbeitung in Prolog erfüllt. Somit wird jede Verbesserung, die in der Zeigerverarbeitung gemacht werden kann, in deutliche Verbesserungen in der Ausführung in Prolog umgesetzt.
  • Figur 4 zeigt die Logik, die zur Zeigerverarbeitung gemäß dem Stand der Technik gehört. Figur 5 zeigt die Logik, die zur Zeigerverarbeitung gemäß dem Gegenstand der Erfindung gehört. Diese Figuren werden nachstehend im einzelnen erörtert.
  • Mit Bezug auf Figur 1 wird ein Stand der Technik eines klassischen Objektwortes in Prolog gezeigt. Das erste Informationsbyte enthält das Feldkennzeichen 10. Die verbleibenden Informationsbytes enthalten das Adreßkennzeichen 20. Das Feldkennzeichen 10 ist eine Ganzzahl, welche das Objekt in Prolog als Objekt der folgenden Art identifiziert: Zeiger, freie Variable, Konstante (Atom, Ganzzahl, ...) oder Rahmen (Prolog- Liste). Die Konstante benutzt das Adreßkennzeichen 20 als einen Zeiger im zugehörigen Deskriptor der Konstanten. Das Adreßkennzeichen 20 kann anstelle einer Adresse Direktdaten enthalten. Kleine Ganzzahlen, welche in den Raum des Adreßkennzeichens 20 eingesetzt werden, werden üblicherweise auf diese Art dargestellt.
  • Der Rahmen benutzt das Adreßkennzeichen 20 als Zeiger im Deskriptor des Rahmens. Diese Architektur wird durch die reduzierte Größe des Adreßkennzeichens 20 beschränkt, das auf dem einen Byte des Feldkennzeichens 10 basiert. Anstatt einen Adreßraum mit einunddreißig Bits zu nutzen, ist somit nur eine Adressierung mit vierundzwanzig Bits verfügbar. Einige Implementierungen in Prolog benutzen ein Feldkennzeichen von weniger als einem Byte; keiner benutzt jedoch ein einzelnes Bit, weil das Feldkennzeichen im klassischen Prolog Zahlen von eins bis sechzehn übermitteln muß. Die Ein-Byte-Architektur ist die gängigste Annäherung, da die meisten vorhandenen Computer Befehle zum Abruf eines Bytes haben; jedoch sehr wenige Computer Befehle zum Abruf von 3 bis 5 Bits haben.
  • Architektur der Erfindung
  • Objekte in Prolog sind "markierte Wörter" nach einer der folgenden Arten:
  • 1) Zeiger in einem anderen markierten Wort;
  • 2) freie Variable;
  • 3) kleine Ganzzahl;
  • 4) Zeiger in einem Objekt in Prolog, das im globalen Stapelspeicher gespeichert ist (was bedeutet, daß das Adreßfeld auf einen Objekt- Deskriptor im globalen Stapelspeicher zeigt); und
  • 5) Zeiger in einem Objekt in Prolog, das im Codebereich gespeichert ist (was bedeutet, daß das Adreßfeld auf einen Objekt-Deskriptor im Codebereich zeigt).
  • Das Prolog-system der Erfindung ersetzt jedes Objekt der Art "freie Variable" durch ein Objekt der Art Zeiger, dessen Adreßfeldpunkte in sich. Es ist einfach, einen Zeiger von einer freien Variablen zu unterscheiden, da ein Zeiger niemals auf sich selbst zeigt.
  • Die Verarbeitung des Gegenstands der Erfindung erfordert ein wenig mehr Vorbereitungsarbeiten, um das Adreßfeld zu initialisieren, und das Entreferenzieren der Verarbeitung erfordert ein zusätzlicher Test. Der häufigste Befehlssatz in Prolog, das Kopieren, wird jedoch optimiert.
  • In einem klassischen Prolog-System wird das System, um ein Objekt zu kopieren, aufgefordert
  • (a) zu prüfen, ob es sich um eine freie Variable handelt;
  • (b) wenn ja, dann ist das Objekt ein Zeiger auf die freie Variable; und
  • (c) wenn nicht, dann ist die Kopie das Objekt.
  • Bei Benutzung dieser Annäherung ist die Kopie stets eine einfache Kopie.
  • Eine Kopie von der Art des Objekts der Kategorien (4 & 5) an den Anfang des Objekt-Deskriptors setzen. Dieser Zusatz beeinflußt den Codebereich nicht, da es ein statischer Code ist, und durch Hinzufügung dieses Bytes zu den Objekten des globalen Stapelspeichers wird es möglich, den globalen Stapelspeicher linear zu durchsuchen, was die Speicherbereinigungskomprimierung einfacher macht. In jedem markierten Objekt, ausgenommen kleine Ganzzahlen, zeigt der Adreßteil des Objekts auf einen anderen Zeiger oder auf ein markiertes Wort.
  • Beim nächsten Schritt wird die kleine Ganzzahl unterdrückt und nur die Ganzzahl benutzt. Der Nachteil ist, daß eine kleine Ganzzahl nur durch einen Zeiger dargestellt wird. Dieses Problem kann bei sehr kleinen Ganzzahlen gelöst werden, indem eine Tabelle von diesen im Konstantenbereich erstellt wird.
  • Jetzt ist für jedes markierte Wort der Adreßteil ein gültiger Zeiger, der auf einen anderen Zeiger oder ein markiertes Wort zeigt. Jedes markierte Objekt ist entweder
  • 1) ein Etikettzeiger oder
  • 2) ein anderes Kennzeichen, das wiederhergestellt werden kann, indem der Wert, auf den das Adreßfeld zeigt, benutzt wird.
  • Das Feldkennzeichen ist nicht länger erforderlich, da es durch den Objekt-Deskriptor wiederhergestellt werden kann. Wir müssen nur in der Lage sein, zwischen einem Objekt in der Art eines Zeigers, das auf einen Zeiger zeigt und einem Objekt in der Art freie Variable, das auf einen Objekt-Deskriptor zeigt, zu unterscheiden. Dies wird erreicht, indem das werthöhere Bit des Objekt-Deskriptors gesetzt und der Adreßraum auf 31 Bits reduziert wird, wie dies im einzelnen nachstehend beschrieben wird. Das werthöhere Bit wird benutzt, weil es in einer MVS/XA Maschine am einfachsten zu prüfen ist, und es nicht zur Adressierung verwendet wird. Ein Fachmann wird erkennen, daß das wertniedrigste Bit ohne übermäßiges Experimentieren ersetzt werden kann.
  • Die Erfindung benutzt zwei Arten von Objektwörtern, die in den Figuren 2 und 3 dargestellt sind. Figur 2 zeigt ein Objekt in der Art eines Zeigers gemäß der vorliegenden Erfindung. Das erste Bit 30 des 32-Bitwortes ist ein Feld. Das Feld unterscheidet zwischen Objektwörtern in der Art Zeiger und in der Art Deskriptor. Wenn das Bit nicht Null ist, dann handelt es sich um einen Deskriptor. Die nächsten einunddreißig Bits der Information 40 sind die Adresse des Prolog-Objekts. Der gesamte Adreßraum der 370/XA Umgebung wird somit ausgenutzt.
  • Figur 3 stellt ein Objektwort in Prolog in der Art Deskriptor gemäß der Erfindung dar. Das erste Bit 50 wird auf eins gesetzt, um die Art des Deskriptors anzuzeigen. Die nächsten sieben Bits werden in der klassischen Annäherung in Prolog als ein Feldkennzeichen 60 benutzt. Die verbleibenden vierundzwanzig Bits 70 variieren auf der Basis des Werts des Feldkennzeichens 60. Es werden später einige Beispiele gezeigt, um die Implementierung der zahlreichen Objekte zu verdeutlichen.
  • Ein Fachmann auf dem Gebiet der Kompilierertechnologie wird ohne weiteres die Vorteile verstehen, die mit dieser Architektur erzielt werden. Ein einfacher Bittest genügt, um ein Objektwort in Prolog in der Art Zeiger von jedem anderen Objekt zu unterscheiden. Dann ist die Adresse bereits in ausführbarer Form. Dies hebt sich vom Stand der Technologie ab, in dem das Feldkennzeichen acht Bits belegt.
  • Eine anfängliche COMPARE Operation war notwendig, um die Art des Objektwortes in Prolog zu bestimmen. Anschließend war eine weitere UND Operation erforderlich, um das Feldkennzeichen zu entfernen, das für eine effektive Adresse nur vierundzwanzig Bits läßt. Dadurch konnte der gesamte Adreßraum mit einunddreißig Bits nicht ausgenutzt werden, und zusätzlicher Verarbeitungsaufwand war mit jedem Zeigerobjekt verbunden. Da das Zeigerobjekt in der Verarbeitung in Prolog wichtig und eines der am meisten genutzten Objekte ist, wurde die Optimierung des kompilierten und interpretierten Prolog-Codes beträchtlich verringert.
  • Durch die Erfindung wird der Aufwand, der mit der Zeigerobjekt-Verarbeitung in Prolog verbunden ist, deutlich reduziert. Ein einfacher Test des Objektwortes wird ganz durch die Adresse des Zeigers bestimmt. Somit ist keine weitere Verarbeitung erforderlich, bevor die Adresse zur Ausführung verfügbar ist. Die maskierte Vergleichs- und UND-Operation, um das Feldkennzeichen zu strippen, entfällt ganz.
  • Figur 4 ist ein Flußdiagramm, das ein Beispiel einer klassischen Objektverarbeitung in Prolog gemäß der vorliegenden Erfindung zeigt. Das Beispiel entreferenziert ein Prolog-Objekt, das in Register R enthalten ist.
  • Die Verarbeitung beginnt im Funktionsblock 100, wobei das Feldkennzeichen, das in Register R enthalten ist, in das benutzerdefinierte Register x geladen wird. Anschließend wird im Funktionsblock 102 das Register x geprüft, um festzulegen, ob es sich um einen Zeiger oder eine andere Art von Objekt handelt. Wenn es sich um einen Zeiger handelt, dann ist das Register R mit der 24-Bit-Adresse in R zu laden und das Informationswort in die Adresse in R als effektive Adresse des Zeigers zu laden.
  • Wenn der Test eine Variable angibt, dann wird bei 106 abwechselnd eine Verzweigung mit einer Routine durchgeführt, um eine Variable in Prolog zu verarbeiten. Wenn der Test ein Atom angibt, dann erfolgt bei 108 eine Verzweigung mit einer Routine, um ein Atom in Prolog zu verarbeiten. Wenn der Test einen Rahmen anzeigt, dann wird bei 110 eine Verzweigung durchgeführt, um einen Rahmen in Prolog zu verarbeiten.
  • Figur 5 zeigt ein Flußdiagramm der detaillierten Logik, die zu der Objektverarbeitung in Prolog gemäß dem Gegenstand der Erfindung gehört. Der Funktionsblock 120 lädt das Wort, auf das von Register R gezeigt wurde, in Register X. Dann überprüft der Entscheidungsblock 122 Register X auf eine negative Zahl. Wenn X positiv ist, dann versucht Prolog, X und R im Funktionsblock 124 zu unifizieren. Wenn es sich bei X und R um Variable handelt, dann werden die beiden Variablen äquivalent, die Unifizierung gelingt, und X enthält eine Variable, somit wird die Information bei 126 als Variable verarbeitet. Andernfalls werden die Inhalte aus Register X in Register R im Funktionsblock 128 kopiert und die Verarbeitung ist abgeschlossen. Wenn Register X anfangs negativ war, dann wird in Funktionsblock 130 das werthöhere Byte von X in das wertniedrigste Byte von Register R geladen, und die drei werthöheren Bytes werden herausgeschoben. Anschließend wird in Funktionsblock 135 die Art getestet, um festzulegen, ob es sich um ein Atom oder um einen Rahmen handelt. Wenn es sich um ein Atom handelt, geht die Steuerung bei 140 zu einem Atom-Objektprozessor in Prolog. Wenn es sich um einen Rahmen handelt, geht die Steuerung bei 150 zu einem Rahmen-Objektprozessor in Prolog.
  • Figur 6 zeigt eine Darstellung einer freien Variablen in einem Objektwort in Prolog gemäß der vorliegenden Erfindung. Da eine freie Variable in Prolog normalerweise eine Speicherstelle im Speicher ist, ist das Objekt effektiv eine Adresse. Somit wird 200 auf null gesetzt und die restlichen einunddreißig Bits 210 sind die effektive Adresse der Variablen. Dies bedeutet, daß ein Test des Objektwortes in Prolog angeben wird, daß es sich bei dem Objekt um eine Adresse handelt, und daß die Information in der Adresse als variable Information verarbeitet werden kann. Es wird eine wesentliche Einsparung im Verarbeitungsaufwand erreicht. Außerdem steigt der effektive Speicherbereich für Variable drastisch an.
  • Figur 7 zeigt ein Beispiel einer Konstanten in einem Objektwort in Prolog gemäß der Erfindung. Die besondere Konstante ist ein Atom in Prolog. Somit wird das erste Bit 300 auf null gesetzt, um anzuzeigen, daß es sich bei dem Objekt um einen Zeiger handelt, und daß die restlichen einunddreißig Bits 310 eine Adresse in der Datenstruktur sind, die zu dem Atom gehört.
  • Die Datenstruktur wird im Speicher gespeichert, wie 311, 312, 313 und 314 zeigen. Das erste Bit 311 gibt an, daß das Objektwort keine Adresse ist. Somit ist das nächste Informationsbyte 312 ein Feldkennzeichen, das verarbeitet wird, um die Art der Konstanten in Prolog zu bestimmen. In diesem Fall ein Atom. Die Bytes (313 und 314), die dem Feldkennzeichen 312 folgen, variieren in Abhängigkeit von der Art der Konstanten in Prolog. Sogar in einem Nicht-Zeiger-Objekt ist der Verarbeitungsvorteil durch Nutzung der Objektarchitektur in Prolog gemäß der Erfindung vorhanden.
  • Figur 8 zeigt ein Beispiel eines Rahmens in einem Objekt in Prolog gemäß der Erfindung. Ein Rahmen wird als Zeiger in einer Datenstruktur dargestellt, die Informationen enthält, welche zu dem besonderen Rahmen gehören. Somit wird das erste Bit 400 des Rahmens auf null gesetzt, um anzuzeigen, daß eine Adresse in den restlichen einunddreißig Bits 410 enthalten ist. Die Adresse wird als Zeiger in der Datenstruktur benutzt, die zu dem Rahmen 411, 412, 414, 416 und 418 gehört.
  • Das erste Bit der Datenstruktur 411 wird auf eins gesetzt, um anzuzeigen, daß die nächsten sieben Bits 412 ein Feldkennzeichenwert sind. In diesem Fall gibt der Wert an, daß es sich bei der Datenstruktur um einen Rahmen handelt. Die verbleibende Information 414, 416 und 418 ist eine klassische Rahmen- Datenstruktur in Prolog.
  • Implizite Argumente
  • In den klassischen Implementierungen in Prolog, zum Beispiel in den Interpretierern/Kompilierern in Prolog, die von Herrn Warren früher beschrieben wurden, erfordern Befehle die ausdrückliche Aufzählung von einer Vielzahl von Feldern, wie dies in Figur 9 dargestellt ist. So ist zum Beispiel der Code für das zweite Argument eines (*,hello) Befehls get_constant hello, A2, das, wie in Figur 9 dargestellt, codiert wird.
  • Die Felder des zweiten Arguments des Befehls enthalten code_op 500, eine Referenz in dem Register, die für die Operation 510 benutzt wird und einen Index in der Konstanten 520. Jedes der Felder muß separat zerlegt werden, um zu prüfen, ob die korrekte Information geliefert wurde. Ein Indexfeld wie 520 verlangt auch, daß der Wert, der in dem Indexfeld enthalten ist, zu dem entsprechenden Relativzeigerregister hinzugefügt wird, um die Adresse der Konstanten zu erhalten. Diese Operationen sind zeitraubend und tragen viel zur Verschlechterung der Ausführungsgeschwindigkeit bei, die zu einem Interpretierer gehört.
  • Die Erfindung vereinfacht das Befehlsformat, wie dies in Figur 10 dargestellt ist. Die einzige Information, die in dem Befehl benötigt wird, ist die Adresse der Konstanten 550. Die Befehle unterscheiden sich von den Objekten, die oben beschrieben wurden, indem das erste Bit (Vorzeichenbit) getestet wird.
  • Wenn das Informationswort negativ ist (ein Bit), dann ist ein Befehl vorhanden. Wenn das Informationswort positiv ist (Nullbit), dann ist ein Zeiger in einem Objekt in Prolog vorhanden. So wird in unserem Beispiel das zweite Argument des Befehls als Informationswort, dessen erstes Bit auf null gesetzt wird, codiert und die zusätzlichen einunddreißig Informationsbits sind ein Zeiger, welcher die Adresse der Konstanten "hello" enthält.
  • Der Interpretierer hat alle Informationen, die erforderlich sind, um den get_constant Befehl ohne weitere Vorverarbeitung auszuführen. Das Register, das für get_constant benutzt wird, wird durch den Interpretierer implizit zugeordnet, was auf der aktuellen Zuordnung der Register basiert. Es gibt keine explizite Zuordnung des Registers durch den Befehl.
  • Das Registerfeld in dem Befehl kann von dem von Wam für d(U*,V,X, (DU*V) + (U*DV)) erzeugten Code weggelassen werden:
  • get_structure '*'/2,A1 % d(*/2(
  • unify_variable A1 % U,
  • unify_variable Y1 % V),
  • get_variable Y2,A2 % X,
  • get_structure '+'/2,A3 % +/2(
  • unify_variable A4 % SS1,
  • unify_variable A5 % SS2),
  • get_structure '*'/2,A4 % SS1 = */2(
  • unify_variable A3 % DU,
  • unify_value Y1 % V),
  • get_structure '*'/2,A5 % SS2 = */2(
  • unify_value A1 % U,
  • unify_value Y3 % DU)
  • Kann durch das inventierte Codierschema ersetzt werden, indem zwei neue Befehle, die nachstehend abgebildet sind, hinzugefügt werden.
  • unify_stack
  • Unify_stack funktioniert als unify_variable. Das Argument wird jedoch in einem Register und nicht in einem Stapelspeicher gespeichert.
  • Pop_structure F
  • Pop_structure F funktioniert als get_structure F, Ai ausgenommen, das ein Wort aus dem Stapelspeicher entnimmt und dieses Wort anstelle von Ai benutzt.
  • Mit diesen Befehlen kann der Code aus dem Stand der Technik, der oben gezeigt wurde, rückgeschrieben werden (siehe unten).
  • get_structure '*'/2,A1 % d(*/2(
  • unify_variable A1 % U,
  • unify_variable Y1 % V),
  • get_variable Y2,A2 % X,
  • get_structure '+'/2,A3 % +/2(
  • unify_stack %
  • unify_stack %
  • pop_structure '*'/2 % = */2(
  • unify_value A1 % U,
  • unify_variable Y3 % DU)
  • pop_structure '*'/2 % = */2(
  • unify_variable A3 % DU,
  • unify_value Y1 % V),
  • In dem obengenannten Code benutzt nun der erste get_... Befehl immer A1 und die nächsten get_... Befehle von Index i benutzen Ai. Es ist möglich, ein neues Register So hinzuzufügen, das von Befehlen wie try_... (vor Beginn der Verarbeitung eines Prädikats) rückgestellt wird, und das jedesmal um eins inkrementiert wird, wenn ein get_... Befehl ausgeführt wird. Somit benutzt jeder get_... das Register von Index S0 als Registerargument, so daß dieses Argument nicht explizit als Teil des Befehls codiert werden muß. Die gleichen Schritte sind für die put_ ... Befehle ebenso effektiv.
  • Das erste Argument des Prädikats von einem Schluß einer Klausel für Befehl b(hello) in Prolog ist put_constant hello,A1, und die klassische Codierung des ersten Arguments wird in Figur 11 gezeigt. Code_op des Befehls 560 ist ein Wert, der für den put_constant Befehl bezeichnend ist.
  • Der code_op 560 wird von einer Referenz in dem Register gefolgt, die für die Operation 570 benutzt wird, und einem Index in der Konstanten 580. Jedes der Felder muß separat zerlegt werden, um zu überprüfen, ob die korrekte Information geliefert wurde. Ein Indexfeld wie 580 verlangt ebenfalls, daß der Wert, der in dem Indexfeld enthalten ist, zu dem entsprechenden Relativzeigerregister hinzugefügt wird, um die Adresse der Konstanten zu erhalten. Diese Operationen sind zeitraubend und tragen viel zur Verschlechterung der Ausführungsgeschwindigkeit bei, die zu einem Interpretierer gehört.
  • Eine Alternative ist es, die komplette Konstante in den Befehl zu schreiben, anstatt diese als Relativzeiger oder Adresse zu codieren. Durch diese Technik wird der Abruf der Konstanten etwas schneller, erzeugt jedoch einen umfangreicheren Befehl.
  • Figur 12 zeigt das Codieren des ersten Arguments gemäß dem Gegenstand der Erfindung. Da die Adresse der Konstanten "hello" alles ist, was für den Befehl erforderlich ist, ist ein Informationswort mit dem auf null gesetzten Vorzeichenbit ausreichend, um die Information, die für das erste Argument erforderlich ist, komplett zu übermitteln. Noch einmal: für den Interpretierer ist keine explizite Aufzählung eines Argumentwertes erforderlich, um den Befehl auszuführen. Es ist außerdem keine Verarbeitungszeit zur indirekten Indexierung erforderlich, um die Adresse der Konstanten zu erhalten.
  • Da alle abstrakten Befehle alternativ mit einem op code von einem Byte beginnen, und ein Objekt in Prolog ein markiertes Wort ist, wo das erste Byte das Kennzeichen ist, ist es möglich, für den op code der unify_constant Befehle den Wert von der Art des Atoms auszuwählen. Somit können die unify_constant "hello" Befehle durch die Darstellung des atoms "hello" ersetzt werden. Es ist auch möglich, dies für get_constant, put_constant, put_structure und get_structure für die Rahmen durchzuführen.
  • Wenn diese Umwandlung nun sowohl für unify_constant als auch put_constant und get_constant angewendet wird, liegt das Problem darin, daß jeder dieser Befehle genau die gleiche Darstellung hat. Dieses Problem wird überwunden, indem ein Finite-Automatisierungsprozessor benutzt wird, wie dies in den Figuren 13A - 13C dargestellt ist. Die separaten Befehle werden durch Benutzung einer 4-Hauptstatus-Automatisierung unterschieden. Die Status sind Argumentieren, Aufbauen, Lesen und Schreiben. Durch die Automatisierung wird der Schritt zur Durchführung eines expliziten Tests des Ausführungsmodus (Lesen/Schreiben) während der Verarbeitung von irgendwelchen unify_... Befehlen vermieden.
  • In einigen Fällen ist der Kontext nicht ausreichend, um der Automatisierung zu erlauben, den Modus des nächsten Befehls vorherzusagen. Wenn zum Beispiel ein Atom, das als unify_constant zu interpretieren ist, von einer get_variable gefolgt wird, weiß die Automatisierung, daß die get_variable in einem Arg-Modus ausgeführt werden muß. Wenn jedoch ein Atom, das als unify_constant zu interpretieren ist, von einem anderen Atom gefolgt wird, ist es gut, wenn das zweite Atom als unify_constant interpretiert werden muß; wenn dieses jedoch als get_constant interpretiert werden muß, dann muß der Codegenerator einen Pop head Befehl zwischen diesen Befehlen einsetzen. Pop_head bedeutet, daß die Emulation im Arg-Modus fortgesetzt werden muß.
  • Befehle in Prolog haben im allgemeinen ein Format, das einen opcode und eine Vielzahl von Feldern enthält, die den vorerwähnten get_constant und put_constant Befehlen ähnlich sind. Jeder Befehl, der vorher eine explizite Registeraufzählung und/oder eine implizite Adreßberechnung erforderte, führt deutliche Verbesserungen in der Ausführung durch, indem ein Decodieren von Argumenten, die durch die Erfindung ersetzt werden, entfällt.
  • Die Figuren 13A - 13C zeigen ein Flußdiagramm, das die zur Befehlsverarbeitung gehörende Logik gemäß der Erfindung darstellt.
  • Unterbrechungsverarbeitung
  • Eine der inventierten Einrichtungen des Prolog-Systems ist der neue Begriff von Unterbrechungen in Prolog. Eine Multitasking- Fähigkeit ist in Prolog unbedingt erforderlich; es ist jedoch ausgesprochen schwierig, Unterbrechungsverarbeitung hinzuzufügen, weil in Prolog vorab zugeordnete, lineare Stapelspeicher verwendet werden. Somit ist eine Kopie des ganzen Stapelspeichers für jede Aufgabe in Prolog erforderlich, damit die Aufrechterhaltung von Systemintegrität gewährleistet wird. Unterbrechungsverarbeitung ist einfacher zu implementieren, da alle unterbrochenen Programme gemeinsam die gleichen Stapelspeicher benutzen können.
  • Unterbrechungsverarbeitung ist möglich, indem ein Anzeiger gesetzt wird, der das Auftreten einer Unterbrechung registriert. Dann wird jedesmal, wenn ein neues Prädikat gefeuert wird, die Anzeiger-Verfolgungsunterbrechung überprüft, um festzustellen, ob eine Unterbrechung aufgetreten ist und um die Verarbeitung der Unterbrechung auszulösen. Diese Architektur beschränkt die Unterbrechungsverarbeitung auf einen einzelnen Platz in der Systemverarbeitung in Prolog, indem somit ein Standard-Prädikat-Verarbeitungsmechanismus genutzt wird. Indem die Ausführung eines Prädikats erlaubt wird, dem durch Ausführung eines anderen Prädikats jedesmal zuvorgekommen wird, wird das Schreiben eines optimierten Kompilierers für Prolog sehr schwierig.
  • Durch die Einführung von zwei Arten von Unterbrechungen soll dieses Problem gelöst werden. Die erste, TYP 1, ändert die Ausführung, so daß, wenn eine Unterbrechung, zum Beispiel Prädikat p(X) anstelle des aktuellen Prädikats c(...) aktiviert wird, das ausgeführte Ziel
  • p(X) & c (...).
  • ist.
  • MERKE: die Ausführung von p(X) kann scheitern oder einige Zurückverfolgungsknoten verursachen.
  • Die zweite Art, TYP 2, ändert die Ausführung, so daß, wenn eine Unterbrechung, zum Beispiel Prädikat p(X) anstelle des aktuellen Prädikats c(...) aktiviert wird, das ausgeführte Ziel
  • (p(x) & fail; true) & c (...)
  • ist.
  • MERKE: die Ausführung von (p(X) & fail; true) wird niemals eine Zurückverfolgung verursachen oder den Instantisierungsstatus der Variablen in Prolog ändern.
  • Unterbrechungen von TYP 1 führen Zurückverfolgungsknoten auf eine eher zufällige Art und Weise ein, und ihre Nutzung in einem völlig kompilierten Code ist auf eine kleine Untermenge spezifischer Unterbrechungen begrenzt. Der Inhalt des Stapelspeichers in Prolog ist vor und nach der Ausführung von Unterbrechungen von TYP 2 genau der gleiche, so daß Prolog die Unterbrechungen von TYP 2 ignorieren kann, wenn es eine Optimierung von großer Reichweite des kompilierten Programms durchführt. Somit kann eine Unterbrechung von TYP 2 vor Aktivierung von irgendeinem Prädikat eines kompilierten Codes in Prolog aktiviert werden.
  • Unterbrechungen in Prolog sind nützlich, um
  • 1. eingefrorene Prädikate zu aktivieren;
  • 2. schrittweise zu korrigieren;
  • 3. den Speicherbereiniger zu aktivieren; und
  • 4. Benutzern zu ermöglichen, asynchrone Fälle zu verarbeiten
  • Nicht-Abruftechniken zur Unterberechungsverarbeitung
  • Das Prolog-System muß Softwareabrufe bei Unterbrechungen während der Durchführung der Ausführungsoptimierung vermeiden. Logische Unterbrechungen und Dämonen werden benutzt, um die Nicht-Abruf-Unterbrechungsverarbeitung bereitzustellen. Logische Unterbrechungen sind Software-Auslegungen, die das Auftreten von asynchronen Fällen registrieren, die während der Ausführung eines PROLOG-Programms auftreten. Das Ereignis löst eventuell ein anderes PROLOG-Programm aus, Dämon genannt, der von PROLOG definiert oder von einem Benutzer-Prolog-Programm individuell angepaßt wird. Die beste Analogie zu einem Dämon in einer klassischen Computerverarbeitung ist eine Aufgabe.
  • Eine Aufgabe besteht aus einem Satz von Befehlen, oft für einen einzelnen Zweck, bei der oft spezifische Eingaben zur Ausführung erforderlich sind. Aufgaben können unterbrochen werden, während diese auf den Abschluß von anderen Aufgaben warten, die einer unterbrochenen Aufgabe Informationen zuführen können. Ein Dämon in Prolog wird ausgelöst, um die Unterbrechung zwischen Prädikaten in der angegebenen Zeit zu verarbeiten. Nachstehend werden einige Beispiele zur logischen Unterbrechungsverarbeitung aufgezeigt.
  • Verzögerte Auswertung
  • Vordefinierte, logische Unterbrechungen in PROLOG enthalten die verzögerte Auswertung. Die verzögerte Auswertung ist die Instantisierung einer eingefrorenen Variablen. Eine eingefrorene Variable ist eine Variable, die auf den Abschluß eines anderen Ziels wartet, um ihre Verarbeitung beenden zu können. Der Dämon ist in diesem Beispiel das wartende Prädikat. Eine eingefrorene Variable ist eine speziell ungebundene Variable. Wenn dieser Variablen ein Wert zugeteilt wird, wird ein vom Benutzer definiertes Prädikat in Prolog getriggert.
  • SPEICHERBEREINIGUNG
  • Die logische Unterbrechung ist die Gesamtheit des Trail-Stapelspeicherüberlaufs und der Dämon ist der Speicherbereiniger. Bei Auftreten eines Überlaufs des Stapelspeichers wird die Größe des Stapelspeichers um eine geringe Menge inkrementiert, damit der Prozeß in Prolog fortgesetzt werden kann, bis die nächste Unterbrechung von Typ 1 erkannt wird. Dann verarbeitet der Speicherbereiniger den Stapelspeicher, um Platz zurückzugewinnen. Die mit kleinen Mengen inkrementierten Bereiche, einer für den Trail-Stapelspeicher und einer für den gesamten Stapelspeicher, werden bei Initialisierung der Stapelspeicher vorbelegt.
  • Die Speicherbereinigung kann bei Überlauf des Stapelspeichers nicht erfolgen, sondern tritt bei Aktivierung des nächsten Prädikats auf. Dies entsteht aufgrund der Unsicherheit von lebenden Elementen während einer Rechenoperation.
  • SCHRITTWEISE KORREKTUR
  • Die logische Unterbrechung ist der Schritt von einem Prädikat zum nächsten und der Dämon ist der Debugger.
  • EXTERNE TERMINAL-UNTERBRECHUNG
  • Die logische Unterbrechung ist die Aktion des Benutzers über eine Terminaleingabe und der Damon ist der Benutzercode in PROLOG, der zuvor als Bearbeitungsprogramm der Terminal-Unterbrechung erörtert wurde.
  • Unterbrechungsverarbeitungslogik
  • Unterbrechungen werden von der normalen PROLOG-Ausführung asynchron über die logische Unterbrechungsverarbeitung erfaßt. Diese werden analysiert und nur in der Ausführung "safe points" verarbeitet. Die "safe points" treten beim Schalten von einem Prädikat zum nächsten auf. In diesem Augenblick muß PROLOG mittels Prüfung bestimmen, ob irgendeine anhängige Unterbrechung besondere Aufmerksamkeit erfordert. Diese Bestimmung erfordert nur einen Test von einem Speicherplatz (Anzeiger) mit etwa zwei Befehlen:
  • 1. Anzeiger auf anhängige Unterbrechung testen und
  • 2. Anzeiger mit den Verarbeitungsroutinen der logischen Unterbrechung verzweigen.
  • PROLOG benutzt eindeutig einen besseren Weg, um anhängige, logische Unterbrechungen ohne explizite Prüfung zu verarbeiten. Die Erfindung nutzt den gemeinsamen Aufrufmechanismus der Prädikatverarbeitung aus, der in allen Prolog-Systemen verwendet wird. Alle Prädikate, ob interpretiert, inkremental kompiliert oder ganz kompiliert, benutzen die gleiche (kurze) Befehlssequenz. Diese befindet sich im allgemeinen in einem permanenten Lese-/Schreibbereich genannt "CSINT". Bei "EXEC" in "CSINT" wird die Aufrufsequenz des Prädikats gestartet.
  • Wenn keine logische Unterbrechung anhängig ist, enthält die Sequenz die nächste Prädikatausführungsadresse und verzweigt diese in der normalen Ausführung mit dem Prädikat. Dies ist die Standard-Prädikatverarbeitung in Prolog. Wenn jedoch eine logische Unterbrechung anhängig ist, wird der erste Befehlssatz von dieser Sequenz durch eine Verzweigung in der logischen Unterbrechungsverarbeitungsroutine ersetzt.
  • Der Austausch erfolgt bei Auftreten des asynchronen Ereignisses, d.h. wenn die logische Unterbrechung aufgezeichnet wurde. Zusätzlich zum Setzen der Unterbrechungsfangstelle im "EXEC" Befehl wird die logische Unterbrechung in eine externe logische Unterbrechungsschlange eingereiht. Bei einer Verzweigung mit "EXEC" überträgt die logische Unterbrechungsverarbeitung die Inhalte der externen Schlange in die interne, logische Unterbrechungsschlange, und die externe Schlange wird geleert. Bei Benutzung der externen Schlange muß sichergestellt werden, daß ihre Änderung in der logischen Unterbrechungsaufzeichnungsroutine und der logischen Unterbrechungsverarbeitungsroutine einen "CS" Befehl (Compare and Swap) benutzt.
  • Während der Übertragung von der externen Schlange in die interne Schlange werden die logischen Unterbrechungen nach Prioritäten geordnet. Dann wird die anhängige logische Unterbrechung mit der höchsten Priorität ausgereiht und ihr zugehöriger Dämon wird zur Ausführung aufgelistet.
  • Wenn die interne Schlange durch Ausreihen geleert wird, dann fällt die Unterbrechungsfangstelle auf ihren normalen Wert zurück und führt das normale, nächste Prädikat aus.
  • Detaillierte Unterbrechungslogik
  • Wenn eine Unterbrechung, die zu einem Prädikat p(X,Y,k(0)) gehört, erkannt wird, wird der in Figur 14 gezeigte Steuerblock im Freispeicher aufgebaut, um die logische Unterbrechung zu verarbeiten. IT_BLOCK 800 ist die Adresse des Prädikat-Desckriptors von p (*,*,*,). E- ITNEXT 805 ist ein Zeiger auf die Adresse des nächsten Unterbrechungssteuerblocks oder null, wenn keine weiteren Unterbrechungen verarbeitet werden müssen. X 810 ist ein Zeiger auf die Globalisierungsinformation für X. Y 815 ist ein Zeiger auf die Globalisierungsinformation für Y. k(0) 820 ist ein Zeiger auf die Globalisierungsinformation für k(0).
  • Zwei globale Wörter WAITITS und WAITITU werden im gemeinsamen Speicher benutzt, um das Auftreten einer Unterbrechung anzuzeigen. WAITITS kennzeichnet Unterbrechungen, die auf Zurückverfolgung reagieren und WAITITU kennzeichnet Unterbrechungen, die nicht auf Zurückverfolgung reagieren. Das Wort WAITITU/WAITITS enthält eine Null, wenn keine Unterbrechung aufgetreten ist oder die Adresse des ersten Unterbrechungssteuerblocks, wenn eine Unterbrechung aufgetreten ist. Die Unterbrechungsfangstelle wird gesetzt, wenn WAITITU oder WAITITS nicht Null ist. Es werden sowohl Unterbrechungen benutzt, die auf Zurückverfolgung reagieren als auch Unterbrechungen, die nicht auf Zurückverfolgung reagieren. Wenn es zum Beispiel eine Unterbrechung in Prolog gibt, die zu dem Systembefehl Stop Predicate (SP) gehört, und wenn das Prädikat in Prolog, das zu der Unterbrechung gehört, als 'stop the execution of the current command' (Ausführung des aktuellen Befehls stoppen) definiert wird, dann wird, nachdem jemand den SP Befehl eingegeben hat, die zugehörige Unterbrechung in Prolog aktiviert und die Ausführung gestoppt. Selbst wenn die Zurückverfolgung zwischen der Eingabe des SP Befehls und der Ausführung der zugehörigen Unterbrechung aktiviert wird, wird das Programm gestoppt. Dadurch reagiert diese Unterbrechung nicht auf die Verarbeitung der Zurückverfolgung.
  • Ein Beispiel von einer Unterbrechung, die auf die Zurückverfolgung reagiert, wird nachstehend gezeigt.
  • :- ge(X,0), wenn nicht var(X), a(X,1).
  • 'ge(X.0), wenn var(X)' nicht die Unterbrechung aktiviert, die zu ge(X,0) gehört, sobald X einen Wert empfängt.
  • In dem Beispiel ist die Ausführung das Ziel: - a(X,1) versucht, a(X,1) mit a(4,0) zu unifizieren. Dazu wird X an 4 gebunden. Die Unterbrechung, die zu ge(X,0) gehört, wird getriggert. Nun ge(4,0)), somit wird ge(4,0) in die Liste der aktiven Unterbrechungen aufgenommen. Dann versucht Prolog 1 und zu unifizieren. Dieser Schritt scheitert, wodurch die Zurückverfolgung aktiviert wird. Durch diese Zurückverfolgung wird X im freien Status wiederhergestellt. Da die Unterbrechung ge(X,0) auf der Tatsache basiert, daß X keine Variable ist, muß ge(X,0), um Fehler zu vermeiden, aus der Liste mit den aktiven Unterbrechungen entfernt werden. Diese Art der Unterbrechung muß eindeutig auf die Zurückverfolgung reagieren.
  • Nach der Aktualisierung des WAITITU/WAITITS Wortes wird ein Unterbrechungssteuerblock ähnlich dem in Figur 14 am Ende der verknüpften Liste des Unterbrechungssteuerblocks hinzugefügt, der durch die Adresse verankert wird, die in WAITITU/WAITITS enthalten ist. Wenn ein anfänglicher Unterbrechungssteuerblock bereits vorhanden ist, dann wird die Kette der nächsten Unterbrechungszeiger 805 durchquert, bis ein nächster Unterbrechungszeiger 805 gleich null festgestellt wird. Der genullte, nächste Unterbrechungszeiger 805 wird mit der Adresse des neuen Unterbrechungssteuerblocks aktualisiert. Dann wird, wenn die Zurückverfolgung erforderlich ist, um die Verarbeitung nach der Unterbrechung wiederherzustellen, die Information für die Zurückverfolgung in den Trail-Stapelspeicher gedrückt. So werden durch die Zurückverfolgung die richtigen Werte nach der Unterbrechungsverarbeitung wiederhergestellt.
  • Der EXEC Prädikatprozessor in Prolog wird geändert, um die Inhalte von WAITITS/WAITITU vor Ausführung des nächsten Prädikats zu prüfen. Wenn ein nicht Null Wert erkannt wird, dann wird der erste Unterbrechungssteuerblock aktiviert, das zugehörige WAITITS/WAITITU Wort wird mit dem nächsten Unterbrechungssteuerblock, der in ITNEXT 805 gefunden wird, aktualisiert.
  • Wenn die Aktualisierung in WAITITS ist, dann wird der Trail- Stapelspeicher ebenfalls aktualisiert. Als nächstes wird ein Rahmen erstellt, indem ein Zuordnungsbefehl ausgeführt wird und der Prädikat-Deskriptor von Proc und die Argumente von Proc in den lokalen Rahmen gedrückt werden. Die Argumente von p(*,*,*) werden von dem Unterbrechungssteuerblock 810, 815 und 820 in die Ai Register geladen. Dann wird der Folgezeiger auf die Systemadresse ITRET gesetzt, und die zu der Unterbrechung gehörenden Klauseln werden aktiviert.
  • Wenn die Unterbrechungsverarbeitung abgeschlossen ist, kehrt Prolog zu der Adresse in ITRET zurück und führt die folgenden Operationen durch. Zuerst werden die Ai Register mit Hilfe des Folgezeigers aus dem vorherigen Rahmen neu geladen. Dann werden der Prädikat-Deskriptor, die Zeiger E und P aus dem Rahmen neu geladen. Schließlich beginnt die Ausführung von der Adresse, die von dem vorhergesagten Deskriptor angegeben wird.
  • Die Figuren 15A -15F zeigen ein Blockdiagramm, in dem die Logik dargestellt wird, die zu der zusätzlichen Unterbrechungsverarbeitung in Prolog gemäß dem Gegenstand der Erfindung gehört. Die Stapelspeicher und anderen Elemente von Prolog wurden zuvor im einzelnen beschrieben.
  • Figur 15A zeigt den Status von Prolog, wenn der Test zur Unterbrechung vor Ausführung eines Beispielprädikats a(V,b) erfolgt, wenn keine Unterbrechung aktiv ist.
  • Figur 15B zeigt den Status von Prolog vor dem Test zur Unterbrechungsausführung kurz vor Ausführung des Prädikats a(V,b), wenn eine Unterbrechung von Typ 2, die zu dem Prädikat p(X,Y,k(O)) gehört, wartet.
  • Figur 15C zeigt den Status von Prolog, wenn eine Unterbrechung von Typ 2, die zu dem Prädikat p(X,Y,k(O)) gehört, vor Ausführung des Prädikats a(V,b) verarbeitet wurde.
  • Figur 15D zeigt den Status von Prolog bevor die Unterbrechung getestet wurde, vor Ausführung des Prädikats a(V,b). Eine Unterbrechung von Typ 1, die zu dem Prädikat q(3) gehört, wartet.
  • Figur 15E zeigt den Status von Prolog, wenn eine Unterbrechung von Typ 1, die zu dem Prädikat q(3) gehört, vor Ausführung des Prädikats a(V,b) verarbeitet wurde.
  • Figur 15F zeigt den Status von Prolog, wenn eine Unterbrechung von Typ 1, die zu dem Prädikat q(3) gehört, kurz vor Ausführung des Prädikats a(V,b) verarbeitet wurde.
  • Die Umsteuerung des ersten Befehls aus der gemeinsamen Aufrufsequenz erleichtert die logische Unterbrechungsverarbeitung in PROLOG ohne jeglichen Abrufaufwand.
  • Allgemeine Sprachschnittstelle
  • Die Einzelheiten der Datenstrukturen, die in Prolog verwendet werden, um mit den anderen Programmiersprachen zu kommunizieren, werden im folgenden vorgestellt. Die Datenstrukturen werden benutzt, um Datenargumente von Prolog in andere Sprachen zu konvertieren. Die Datenstrukturen und die weitere Verarbeitung, die hier beschrieben werden, bieten Möglichkeiten, die in Prolog bislang unbekannt waren.
  • Argument-Deskriptor
  • Mit Prolog können Prozeduren, die in C, Cobol, Fortran und PL/I geschrieben wurden, aufgerufen werden. Mit Prolog können Argumente in die Prozeduren übertragen werden, die entsprechend der Sprache formatiert wurden.
  • Zur Konvertierung der Datenargumente aus dem Prolog-Format in das von den Prozeduren erwartete Format verwendet Prolog eine Deskriptortabelle, welche die Verarbeitung benutzt, um die Prolog Information in dem Format, das die Zielsprache erwartet, makroaufzulösen.
  • Mit der Deskriptor-Tabelle können in Prolog die Argumente auf eine sprachunabhängige Weise in eine andere Sprache konvertiert werden. Die Technik bringt auch neue Versionen mit wachsender Flexibilität unter. Prolog wird sogar sprachunabhängig, da die Unterschiede in den einzelnen Sprachen in den Datenstrukturen eingesetzt wurden.
  • Keine Änderung in den Benutzerprogrammen ist erforderlich, wenn eine neue Version von einer Sprache erscheint. Es sind nur Änderungen in den zugehörigen Tabellen durchzuführen. Dadurch werden die Codeänderungen minimiert. Auch unterstützt die Generalisierung in der Konzeption der Deskriptor-Tabelle alle Datenformate, -anordnungen und -strukturen.
  • Allgemeiner Hintergrund
  • In Prolog ist eine externe Erweiterung ein separat kompiliertes Programm-Modul. Es ist als externe Erweiterung in Prolog erkennbar, da es eine externe Erweiterungskopfzeile hat. Die Kopfzeile dient als Kennzeichen für einen externen Prädikatssatz in der Art externe Erweiterung. Jedes externe Prädikat oder jeder extern berechenbare Ausdruck wird seinerseits mit seinem Namen, arity, und im Falle einer externen Erweiterung in einer anderen Sprache mit seinen erwarteten Argumenten beschrieben.
  • Während externe Erweiterungen, die in Assembler geschrieben wurden, Datenstrukturen direkt in Prolog verarbeiten können, müssen externe Erweiterungen, welche in einer anderen Sprache geschrieben wurden, ihre Daten in der Form empfangen, die für die besondere Sprache geeignet ist. Dies bedeutet, daß die Schnittstelle in den sprachexternen Erweiterungen Datenstrukturen in Prolog in eine Form konvertieren muß, die für die Verarbeitung durch externe Erweiterungen passend ist. Die Schnittstelle muß außerdem die Resultate, die von den externen Erweiterungen zurückgeführt werden, nach Prolog zurückkonvertieren.
  • Ein sprachexternes Prädikat oder ein externer, berechenbarer Ausdruck ist ein Unterprogramm. In Cobol ist dies eine Eingabe, in Fortran eine Subroutine oder Funktion, in PL/1 eine Prozedur und in C eine Funktion. Die von dem Unterprogramm erwarteten Parameter werden in Name und Art in anderen Sprachanweisungen, die das Unterprogramm in der externen Erweiterungsquelldatei öffnet, angegeben.
  • Als Teil eines allgemein externen Prädikats oder extern berechenbaren Ausdrucks, einer externen Erweiterungskopfzeile beschreiben die PRODECE Makrobefehle ihrerseits jede externe Erweiterung-jeden extern berechenbaren Ausdruck. Wenn die externe Erweiterung als eine Sprache in der Art der externen Erweiterung beschrieben wird, dann zeigt das ARGS=Descriptor_Label in dem PRODECE Makro auf den PROARGS Makrobefehl des besonderen externen Prädikats oder des extern berechenbaren Ausdrucks.
  • Beschreibung des PROARGS Makro
  • Der PROARGS Makrobefehl hat das folgende Format PROARGS FORMAT Label PROARGS Descriptor_1,Descriptor_2 ... End of PROARGS Format
  • wo jeder Deskriptor seinerseits einen Parameter des Sprachunterprogramms oder im Falle der C Programmiersprache Verschachtelung und Felder in structs beschreibt. Ein Deskriptor kann eines der vier folgenden Formate haben:
  • 1) (nur C) öffnet eine Ebene von C struct;
  • 2) (nur C) schließt eine Ebene von C struct;
  • 3) (DATA_TYPE IO_TYPE) beschreibt einen skalaren Parameter oder (nur C) ein skalares Feld eines structs,
  • 4) (DATA_TYPE IO_TYPE DIMENSIONS) beschreibt einen Anordnungsparameter oder (nur C) ein Anordnungsfeld eines structs.
  • Data_Type spezifiziert die möglichen Zielarten bei der Konvertierung und gehört zu den Standard/XA Datenarten. Figur 16 zeigt die Übereinstimmung zwischen Data_Type 900 und den Standard-Datenarten von 370/XA Assembler 905, C 910, Cobol 915, Fortran 920 und PL/I 925.
  • IO_Type gibt an, ob das Argument eine Eingabe in oder das Resultat aus dem Sprachunterprogramm ist. Bei Verwendung in einem C struct, müssen alle IO_Type des structs den gleichen Wert haben. IO_Type können folgende Werte haben:
  • I Glied der Parameterliste, Eingabe in das Unterprogramm. In C wird das Argument, das von einem Zeiger übergeben wird, als ein * Parameter benutzt.
  • O Glied der Parameterliste, Resultat des Unterprogramms. In C wird das Argument, das von einem Zeiger übergeben wird, als ein * Parameter benutzt.
  • IO Glied der Parameterliste, Eingabe in das Unterprogramm, geändert durch das Unterprogramm und Resultat des Unterprogramms. In C wird das Argument, das von einem Zeiger übergeben wird, als ein * Parameter benutzt.
  • R Registerrückkehrargument (Fortran Funktionen, PL/1 Prozedur ... RETURNS(...) und C Funktionen). Resultat des Unterprogramms. In C wird das Argument, das durch den Wert zurückgeführt wird, nicht als ein * Parameter benutzt.
  • V (nur C) Glied der Parameterliste. Eingabe in das Unterprogramm, Argument wird durch den Wert übergeben, wird nicht als ein * Parameter benutzt.
  • A (nur C) Registerrückkehrargument (C Funktionen). Resultat des Unterprogramms, das von dem Zeiger zurückgeführt wird - wird als ein * Parameter benutzt. Das Unterprogramm, Argument wird durch den Wert übergeben, wird nicht als ein * Parameter benutzt.
  • Schließlich geben die Dimensionen - sofern spezifiziert - an, daß das Argument oder das C struct Feld eine Anordnung ist. Dimensionen können ein oder mehrere N sein, welche die genaue Dimension der Anordnung beschreiben, oder ARGN (Bezugsdimension), die angibt, daß ein anderer Deskriptor -einer von Rang n in der aufsteigenden Argumentsequenz / in den aufsteigenden struct Feldern die eigentliche Dimension enthält.
  • Mit Bezug auf Figur 17 wird ein C Unterprogramm als Beispiel für die inventierte Schnittstelle dargestellt. Figur 18 zeigt die Prolog Proargs Schnittstelleninformation für das C Unterprogramm. In Figur 17 sind Uc 950, SI 955, Dv 957 Eingaben, Dp 959 ist Ein- und Ausgabe, wobei Cp 961 Eingabe, Fa 963 Ausgabe, IP 965 Ein- und Ausgabe ist, und wo SI 955 die eigentliche Dimension der Anordnung Ip 965 enthält. Der entsprechende PROARGS Makrobefehl wird in Figur 18 dargestellt.
  • Argument-Deskriptor-Format
  • Der PROARGS Makrobefehl wird in einen Satz von binären Deskriptoren übersetzt, der die Sprachschnittstelle in Prolog benutzt, um die Daten in Prolog in ein anderes Sprachformat zu konvertieren. Die Schnittstelle ist ein allgemeiner Interpretierer dieser binären Deskriptoren.
  • Das binäre Deskriptor-Format ist in Figur 19 abgebildet. Die Konvertierungsprozesse sind deskriptorgesteuert; bis zum Abschluß sind es sechs Schritte.
  • Erster SCHRITT
  • In den Lese-/Schreibspeicher der Deskriptoren kopieren;
  • Verschieben der "FORCDIM1" Bezugsfelder;
  • Setzen der "FORFDIM, FORFDEF" Anzeiger;
  • Setzen der "FORDAL2, FORDAL4, FORDAL8" Anzeiger gemäß der Feldausrichtungsregeln von C;
  • Berechnung der arity "FORDSKE" für jede Ebene der C struct Verschachtelung gemäß der Feldausrichtungsregeln von C;
  • Prüfen der arity des externen Prädikats oder des externen berechenbaren Ausdrucks.
  • Zweiter SCHRITT
  • Konvertierung von jedem I/IO/V Argument.
  • Dritter SCHRITT
  • Speicherzuordnung für jedes O Argument.
  • Vierter SCHRITT
  • Wenn es sich um V Argumente handelt, sind die Parameterliste und die V Argumente zusammen zu kopieren.
  • Fünfter SCHRITT
  • Eigentlicher Sprachaufruf
  • Sechster SCHRITT
  • Rückkonvertierung von jedem IO/O/R/A Argument.
  • Die Schnittstelle zwischen Prolog und den anderen Sprachen verläßt sich weitestgehend auf die Information, die von dem PROARGS Makro zum Aufbau der Daten in den Formaten geliefert wird, die von dem kompilierten Programm erwartet werden. Dieses Format ist reichlich bemessen und die Konvertierungsroutinen sind leistungsfähig genug, um alle bekannten Arten von Daten (binär, Fließkomma, Zeichen); irgendeine Anzahl von Anordnungsdimensionen und irgendeine Anordnungsdimension; Dimensionen, die einmal und für alle festgelegt werden oder Dimensionen, die das kompilierte Programm in einem anderen Argument erwartet, Parameter, die von dem Wert, der Adresse oder dem Register übergeben werden, Parameter, die als Eingabe übergeben oder als Ausgabe oder als Ein- und Ausgabe zurückgeführt werden, jede Art der C Struktur einschließlich dem verschachtelten struct, zusammen mit der automatischen Ausrichtungsprüfung zu verarbeiten.
  • Einzelheiten der Schnittstelle
  • Das Prolog-System aus dem Gegenstand der Erfindung liefert eine allgemeine Schnittstelle für Routinen, die in einer kompilierten Sprache geschrieben wurden. Einer der Vorteile dieser Schnittstelle liegt darin, die Unzulänglichkeit von Prolog in der Unterstützung bei intensiver Berechnung zu unterstützen. Ein Programmierer kann die numerisch intensiven Teile einer Anwendung für die Implementierung in einer passenderen Sprache reservieren. Die Schnittstelle ermöglicht einer Anwendung in Prolog, Fortran Subroutinen oder Funktionen, PL/1 Non- MAIN Prozeduren und ähnliche Einrichtungen in anderen Sprachen als deterministische Prädikate in Prolog oder als Ausdrücke in Prolog zu nutzen. Die Prolog-Schnittstelle verwaltet ebenfalls das Betriebssystem, das in Teilen von einem kompilierten Programm abhängt und konvertiert Datenarten in Prolog in und aus ihren Äquivalenten in die kompilierten Sprachen.
  • Fortran Beispiel
  • Ein Basis VS/FORTRAN Beispiel wird in Z1FORT1 FORTRAN geliefert. Eine ähnliche Fähigkeit wird für andere Programmiersprachen, zum Beispiel COBOL, PLI, PASCAL, C und Assembler, bereitgestellt. Die Unterschiede zwischen den Schnittstellen für die anderen Sprachen werden in einem gesonderten Abschnitt erörtert.
  • Organisation eines externen Pradikats
  • 1. Eine Funktion oder mehrere Funktionen / Subroutine in einer kompilierten Sprache schreiben. Die Quellen könnten zum Beispiel in MYFORT1 FORTRAN plaziert werden. Es ist nützlich, alle Subroutinen und Funktionen, die in einem Programm in Prolog benutzt werden, in der gleichen Quelldatei zu sammeln, um die Zeit zu optimieren, die für das Umgebungssetup aufgewendet wird. Die FORTRAN und COBOL Sprachen erlauben außerdem nur jeweils ein einzelnes aktives Programm. Diese Einschränkung gilt nicht für "Block Structure Compiled Languages" wie PASCAL oder PL/1.
  • 2. Die Information, die in Figur 20 abgebildet ist und der Hauptprogrammanweisung im Quellcode folgt, ist hinzuzufügen. In anderen Sprachen Hauptprogramm ZIMAIN nennen und das Hauptprogramm nur ZICOMH ohne Argumente aufrufen lassen. Diese Namen sind festgelegt.
  • MERKE: Das Hauptprogramm muß irgendwelche globale Erklärungen und Initialisierungen enthalten. In FORTRAN bedeutet dies Erklärung und Initialisierung der COMMON Bereiche. Diese Verarbeitung muß vor dem Aufruf in ZICOMH stattfinden. Globaler Cleanup, falls erforderlich, muß ebenfalls im Hauptprogramm nach dem Aufruf in ZICOMH stattfinden.
  • 3. Eine ASSEMBLE Deskriptor-Datei mit der Bezeichnung MYFORT0 ASSEMBLE gemäß den Befehlen im nächsten Kapitel vorbereiten.
  • 4. Die FORTRAN Quelldatei kompilieren und MYFORT1 TEXT erzeugen.
  • 5. Die ASSEMBLE Deskriptor-Datei mit MACLIB assemblieren: Prolog, der MYFORT0 TEXT erzeugt.
  • 6. Die folgenden drei Dateien in der Reihenfolge als eine TEXT Datei, MYFORT TEXT genannt, verketten.
  • a. Eine TEXT Datei wird aus der kompilierten Deskriptor- Datei (MYFORT0 TEXT) erzielt;
  • b. Eine Z1COMP1 TEXT Datei wird von Prolog bereitgestellt; und
  • c. Eine TEXT Datei wird durch Kompilieren der FORTRAN Quelldatei (MYFORT1, TEXT) erzeugt.
  • 7. Eine Verbindung zu einem GLOBAL TXTLIB in den kompilierten Sprachbibliotheken (in VS/FORTRAN V2 heißt diese VSF2FORT TXTLIB) vorsehen.
  • 8. Die verkettete TEXT Datei mit den Optionen NOAUTO CLEAR RLDSAVE LADEN.
  • 9. GENMOD der verketteten Textdatei.
  • 10. Eine Eingabe in die Datei in Prolog NAMES wie folgt einfügen: FORTRAN NICKNAME IN Prolog NAMES nick.MYFORT type.PREXTERN file.MYFORT MODULE A END FORTRAN NICKNAME IN Prolog NAMES
  • 11. Nicht vergessen, ein GLOBAL LOADLIB oder GLOBAL TXTLIB zu behalten, wenn dies für die kompilierte Sprache (GLOBAL LOADLIB VSF2LOAD in VS/FORTRAN V2) erforderlich ist.
  • 12. Die nachstehend aufgeführten Prädikate und Ausdrücke verwenden
  • 13. Nach Abschluß der Ausführung ein Fehlerprotokoll erwarten, das von der kompilierten Sprache aufgefangen wurde.
  • Parameterübergabe
  • Die Schnittstelle in Prolog ist so konzipiert, daß die Mehrzahl der Datenarten, die in den verschiedenen Programmiersprachen verwendet wird, untergebracht werden kann. Somit können alle Datenarten, die FORTRAN erkennt, in beiden Richtungen zwischen Prolog und Fortran ausgetauscht werden.
  • Es werden keine Einschränkungen bezüglich der Art von Befehlen gemacht, die das FORTRAN Programm ausführen kann. Dies bedeutet, daß COMMON Verwaltung, Datei oder Terminal IO's, in FORTRAN behobene Fehler, ... alle zulässig sind. Das Fortran Programm kann jedoch nur auf die Datenbereiche zugreifen, die Fortran zugeordnet sind. Dadurch ist der direkte Zugriff von der Fortran Anwendung auf die Bereiche in Prolog nicht zulässig, ausgenommen über die Call-Schnittstelle.
  • Beispielcode
  • Einige Beispiele werden in den Figuren 21, 22 und 23 dargestellt. Figur 21 zeigt den Quellcode für die Funktion STUPID. Die Funktion STUPID wird benutzt, um die Schnittstelle und die FORTRAN Fehlerkorrektur zu prüfen. Figur 22 zeigt die Erklärung der STUPID Funktion mit einer Ursprungsliste von Z1FORT0 ASSEMBLE. Figur 23 zeigt die Information, die angezeigt wird, wenn STUPID während einer Programmausführung in Prolog aufgerufen wird.
  • Um Anordnungen zu erklären, ist die Dimensionsinformation in dem Deskriptor des Arguments als Ergänzung zu dessen Art und IO Steuerung zu plazieren. Für jede Dimension in der Anordnung ist eine Zahl einzusetzen, wenn diese Dimension fest oder eine Referenz wie ARGn ist, wobei n eine positive Ganzzahl ist, welche die Position des Fortran Arguments beschreibt, in dem die Dimension enthalten ist.
  • Die folgenden Regeln steuern die Anordnungsdefinition. Wenn die Dimension eine Referenz ist, muß die entsprechende Argumentart eine Ganzzahl von 4 Bytes (I4) sein. Eine Anordnung wird aus einer Liste in Prolog konvertiert, eine zweidimensionale Anordnung wird aus einer der Listen in Prolog konvertiert. Wenn die Anordnung IO Steuerung I oder IO hat, dann kann die Schnittstelle die Dimensionen der Anordnung aus der Liste in Prolog berechnen. Dadurch werden die Fortran Argumente, welche die Dimensionen enthalten, über die Schnittstelle aufgebaut und können nicht im Prädikat erscheinen. Wenn die Anordnung IO Steuerung O oder R hat, dann muß die Schnittstelle den Speicher für die Resultatanordnung zuordnen und die Fortran Argumente, welche die Dimensionen enthalten, werden über die Schnittstelle aufgebaut und müssen im Prädikat erscheinen.
  • Die Dimensions-Deskriptoren werden aufeinanderfolgend von links nach rechts in Reihe plaziert - die Standardart, um eine mehrdimensionale Anordnung zu bereinigen. Somit erscheinen bei den C, FORTRAN, PASCAL, PL/1 und COBOL Schnittstellen die Dimensionen im Programm in umgekehrter Reihenfolge, wie mit der Beschreibung in Prolog in der Darstellung in Figur 24 verglichen wird.
  • Muster van auswählbaren Erklärungen
  • Anstatt für jede FORTRAN Subroutine und Funktion einen Prädikatnamen zu verwenden, benutzt die Anwendung in Prolog nur ein Prädikat für alle Aufrufe in FORTRAN. Dies wird GENERIC Format genannt. Um dieses verwenden zu können, müssen besondere PRO- DECE Makros in der ASSEMBLE Deskriptor-Datei vorhanden sein. Nehmen wir zum Beispiel an, daß die Anwendung in Prolog alle FORTRAN Subroutinen und Funktionen über einen Prädikatnamen und einen Ausdruck nutzen möchte. Die Deskriptor-Datei enthält dann die in Figur 25 abgebildete Information.
  • Um die auswählbaren Deskriptor-Dateien nutzen zu können, benutzt die Anwendung die Schnittstelle:
  • goals ext_pred(pred_generic(*...), myfort,pgeneric); und ext_func(func_generic(*...),myfort,fgeneric).
  • Dann, wo ein Ziel wie my_stupide(2)
  • verwendet wird, wird dieses durch func_generic(stupide,2)
  • ersetzt.
  • Desweiteren, wo Chaine
  • verwendet wird, kann dieses durch pred_generic(testtabl Chaine
  • ersetzt werden.
  • Die auswählbaren Prädikate und Ausdrücke benutzen ein extra erstes Argument, das die Subroutine oder Funktion definiert, welche die Anwendung benutzt. Dieses enthält ein Atom oder eine Zeichenkette, das bzw. die mit den NAME Feldern der PRO- DECE Makros des externen Moduls verglichen wird, wo der auswählbare PRODECE erscheint.
  • Kompiliertes Prädikat v. Funktion
  • Es gibt kein eins-zu-eins Verhältnis, das eine FORTRAN Subroutine zwingt, als Prädikat benutzt zu werden, und eine FORTRAN Funktion zwingt, als Ausdruck benutzt zu werden. Tatsächlich kann sowohl eine Subroutine als auch eine Funktion als Prädikate in Prolog benutzt werden. Der einzige Unterschied liegt in der PROARGS Erklärung, wo eine Funktion die 10 Steuerung R benutzen wird, und die Erklärung zuerst in der PROARGS Liste erscheinen muß. Wenn die Funktion als Prädikat in Prolog benutzt wird, wird das von der Funktion zurückgeführte Resultat mit dem ersten Argument des Prädikats unifiziert. In diesem Sinn verwendet ein Prädikat, das eine Funktion aufruft, ein Argument mehr als die Funktion erwartet&sub1; um das Resultat zu empfangen.
  • In der gleichen Logik kann sowohl eine Subroutine als auch eine Funktion als Ausdrücke benutzt werden, vorausgesetzt, diese befolgen die folgenden Regeln.
  • 1. Ein Argument wird entweder mit IO Steuerung O, IO, R (nur für Funktion) erklärt, um das Resultat des Ausdrucks zu liefern.
  • 2. Alle anderen Argumente werden mit 10 Steuerung 1 erklärt. Die Unterschiede zwischen kompilierten Prädikaten und kompilierten Ausdrücken enthalten die folgende Liste.
  • a. Kompilierte Prädikate empfangen ihre Argumente nur von Prolog konvertiert, während kompilierte Ausdrücke ihre Argumente bewertet, von Prolog konvertiert, empfangen.
  • b. Die Verwaltung des globalen Stapelspeichers mit kompilierten Ausdrücken ist wirtschaftlicher als mit kompilierten Prädikaten, was bedeutet, daß ein Überlauf des globalen Stapelspeichers weniger wahrscheinlich ist.
  • Als Beispiel zu dem obengenannten Punkt eins schreibt man die Ausdrücke wie in Figur 26 abgebildet. Die Beispiele zeigen die Benutzung von kompilierten Ausdrücken wie 0 + 0, was die automatische interne Bewertung der Argumente des Ausdrucks zeigt.
  • Unterschiede COBOL
  • 1. Das Hauptprogramm muß ein separater Prozedurteil sein;
  • 2. Subroutinen müssen in einem Prozedurteil gesammelt werden, wobei jede Subroutine eine separate ENTRY Anweisung verwendet. Auf Z1COBOL1 COBOL achten; und
  • 3. Mit dem Dezimalformat (PACKED oder ZONED) ist eine Konvertierung in Datenarten nicht möglich. In Cobol heißt das, keine BINÄREN Ganzzahlarten.
  • PASCAL
  • 1. In Pascal Strukturen oder Zeigern ist keine Konvertierung möglich; und 2. Aufgrund der Datenorganisation erzwingt die Parameterübergabe in Pascal eine COPY des Plist im Pascal Stapelspeicher. Dies erfolgt in Z1PASC0 ASSEMBLE ab Zeile 52.
  • PL/1
  • 1. In PL/1 Strukturen oder Zeigern ist keine Konvertierung möglich;
  • 2. Da PL/I Deskriptoren anstelle von Argumenten im Plist für Aggregate erwartet. Somit müssen alle Aggregate als BIN FIXED(31) mit dem BASED Attribut und dem ADDR Builtin erklärt werden.
  • Prolog IN C
  • Prolog liefert eine leistungsfähige Schnittstelle in der C Programmiersprache. Alles, was zuvor in der Schnittstelleninformation beschrieben wurde, ist ebenfalls auf die C Schnittstelle anwendbar. Ein Beispiel von einer C Schnittstelle, die in Figur 27 abgebildet ist, wird in Z1C1 C geliefert.
  • Organisation von C
  • 1. Eine Funktion oder mehrere C Funktionen in eine C Quelldatei schreiben, zum Beispiel MYC1 C;
  • 2. In die gleiche Quelldatei die #INCLUDE Erklärung einfügen, die in Figur 28 abgebildet ist;
  • 3. In die gleiche Quelldatei die MAIN Funktion des C Codes einfügen (siehe Figur 29). Der Aufruf Prolog_INIT muß darin enthalten sein. Vor Prolog_INIT können Sie den C Code einfügen, welcher die globalen Daten des C Codes initialisiert. Nach Prolog_INIT können Sie den globalen Clean-up Code einfügen;
  • 4. Eine ASSEMBLE Deskriptor-Datei mit der Bezeichnung MYC0 ASSEMBLE gemäß den nachstehenden Anweisungen vorbereiten;
  • 5. Die C Quelldatei mit der Kompilierer-Option RENT, welche MYC1 TEXT erzeugt, kompilieren;
  • 6. Die ASSEMBLE Deskriptor Datei mit MACLIB assemblieren: Prolog, der MYC1 TEXT erzeugt;
  • 7. Eine TEXT Datei mit der Bezeichnung MYC TEXT gemäß Figur 30 mit dem CPLINK Dienstprogramm des C Kompilierers außerhalb der folgenden vier Punkte in dieser Reihenfolge aufbauen.
  • a. Die TEXT Datei wird über die ASSEMBLE Deskriptor-Datei (MYC0 TEXT) erhalten;
  • b. Die Z1COMP1 TEXT Datei wird von Prolog bereitgestellt;
  • c. Die Z1COMP2 TEXT Datei wird von Prolog bereitgestellt; und
  • d. Die TEXT Datei wird über die C Quelldatei (MYC1 TEXT) erhalten;
  • 8. Ein GLOBAL TXTLIB zu den C Sprachbibliotheken, LIB und CBASE zuordnen;
  • 9. Das CPLINK, das die TEXT Datei erzeugt, mit den Optionen NOAUTO CLEAR RLDSAVE LADEN;
  • 10. GENMOD des Programms;
  • 11. Eine Eingabe in die Datei NAMES in Prolog wie folgt einfügen: C NICKNAME IN Prolog NAMES nick.MYC type.PREXTERN fileC Module A END OF C NICKNAME IN Prolog NAMES
  • 12. GLOBAL LOADLIB CLINK und GLOBAL TXTLIB CBASE während der Ausführung des C Codes verbinden;
  • 13. Ein EXEC DLIB LOAD vor Benutzung eines C Codes verwenden. Ein EXEC DLIB UNLOAD benutzen, wenn C und Prolog beendet wurden.
  • 14. Die nachstehenden Prädikate und Ausdrücke verwenden; und
  • 15. Nach Ausführung der Funktion Aufruf durch Efin. werden einige Fehlerprotokolle erwartet, die von der kompilierten Sprache kommen.
  • Parameterübergabe und Erklärungen
  • Das Fortran Beispiel für die Funktion Stupid, das in Figur 21 abgebildet ist, wird in C übersetzt und in Figur 31 dargestellt. Es ist zu bemerken, daß die Argumente 10 Steuerung 1, oder 10 von C als Zeiger empfangen werden; dies erklärt, daß TSI in diesem Beispiel immer mit dem C * Entreferenzierungsoperator benutzt wird.
  • Eine Ausführung der C Stupid Funktion liefert die Information, die in Figur 32 angezeigt wird.
  • Unterstützungsfunktionen für C
  • Die Schnittstelle liefert nur für externe Prädikate Unterstützungsfunktionen, die in drei Bereiche aufgeteilt werden können:
  • 1. Speicherverwaltung;
  • 2. Steuerung der Zurückverfolgung und/oder der Fehlerverarbeitung; und
  • 3. Analyse der Datenobjekte in Prolog.
  • SPEICHERVERWALTUNG
  • Die Schnittstelle liefert den Zugriff auf COMAREA, wie dies von dem PROINI Makro definiert wird. Diese liefert ebenfalls eine spezielle Datenart A, die sich in einem Arbeitsspeicherbereich befindet, der über die Zurückverfolgungen beibehalten wird.
  • Prolog_GET_COMAREA()
  • Diese Funktion führt einen Zeiger zu COMAREA zurück, der permanent Teil des Speichers war, der von der externen Erweiterung geladen wird. COMAREA wird von der Schnittstelle mit Ladezeit genullt und danach niemals geändert. Diese wird von dem C Code und gemeinsam von allen C Funktionen der externen Erweiterung benutzt.
  • PROARGS...(AN,I)...
  • Die Schnittstelle ordnet auf Anforderung einen Arbeitsspeicherbreich zur Nutzung einer C Funktion zu. Der Speicherbereich wird in dem PROARGS Makro von der Datenart A mit Datenlänge n beschrieben, die von dem Benutzer definiert wird (zum Beispiel (A256,I) in einem 256 Byte Arbeitsbereich) und IO Steuerung 1. Die entsprechende C Funktion kann dieses Argument mit einem char * Parameter empfangen.
  • Der Arbeitsspeicherbereich ist zur ausschließlich Nutzung der besonderen C Funktion bestimmt, die dies in dem PROARGS Makro definiert. Wenn die C Funktion normal aufgerufen wird und über die Zurückverfolgungsaufrufe von der gleichen Funktion beibehalten wird, wird diese genullt. Diese kann benutzt werden, um die Daten über die Zurückverfolgungsaufrufe einer C Funktion zu behalten.
  • Zurückverfolgung / Fehlerverwaltung
  • Eine C Funktion wird in Prolog in Ermangelung eines deterministischen Prädikats definiert. Der Aufruf der C Funktion kann dieses Verhalten durch einige Funktionen, die von der Schnittstelle geliefert werden, ändern. Ein erster Satz wird verwendet, um die Charakteristika der Rückführungsverarbeitung zu bestimmen. Diese Information wird von Prolog benutzt, um festzulegen, ob die C Funktion gelingen, scheitern oder einen Fehler machen soll, wenn diese zur Schnittstelle zurückkehrt.
  • Prolog_SET_SUCCESS()
  • Diese Funktion kehrt wieder in den normalen Erfolgsstatus zurück. Somit erfolgt die Ausführung in Prolog normalerweise nach der C Rückkehranweisung der C Funktion.
  • Prolog_SET_BACK()
  • Diese Funktion veranlaßt die Ausführung in Prolog, sofort nach der C Rückkehranweisung der C Funktion zu scheitern.
  • Prolog_SET_ERROR(ERROR_CODE)
  • Diese Funktion veranlaßt die Ausführung in Prolog, bei einem Fehler von der Art Error_Code nach der C Rückkehranweisung der C Funktion zu stoppen. Einige vordefinierte Error_Codes werden von der Prolog.H indude file geliefert.
  • Prolog_ERR_GLOBAL Überlauf des globalen Stapelspeichers
  • Prolog_ERR_LOCAL Überlauf des lokalen Stapelspeichers
  • Prolog_ERR_TRAIL Überlauf des Trail-Stapelspeichers
  • Prolog_ERR_SYNTAX Syntax-Fehler
  • Einige der Unterstützungsfunktionen, die Objekte in Prolog analysieren, setzen die zuvor erörterten Error Codes.
  • Prolog_TEST_ERROR()
  • Diese Funktion bestimmt, ob ein Error_Code gesetzt wurde. Diese kehrt zu einem nicht Nullwert zurück, der gleich dem Fehlercode ist, wenn ein Error Code erkannt wurde.
  • Ein zweiter Satz wird benutzt, um zu entscheiden, ob die C Funktion in Zukunft wieder als Teil des Zurückverfolgungsprozeßes aufgerufen werden kann. Wir sagen, daß die C Funktion einen Auswahlpunkt erstellt hat. Es ist zu bemerken, daß die Entscheidung, ob die Funktion einen Auswahlpunkt erstellt, unabhängig von ihrem Rückkehrstatus (Erfolg, Scheitern oder Fehler), wie dieser von dem ersten Satz der Unterstützungsfunktionen verwaltet wird, ist. Wenn jedoch eine Funktion scheitert und einen Auswahlpunkt erstellt hat, wird dieser sofort erneut aufgerufen, da es sich bei diesem Auswahlpunkt um den allerneuesten handelt.
  • Prolog_RESET_CHOICE()
  • Diese Funktion kehrt zum normalen Nicht-Auswahlpunktstatus zurück.
  • Prolog_SET_CHOICE()
  • Mit dieser Funktion wird ein aktiver Auswahlpunkt erstellt. Wenn die Zurückverfolgung auftritt, wird die C Funktion erneut mit den gleichen Argumenten aufgerufen.
  • Prolog_TEST_CHOICE()
  • Diese Funktion bestimmt, ob die C Funktion normal oder als Teil des Zurückverfolgungsprozeßes aufgerufen wurde. Diese kehrt auf einen nicht Nullwert zurück, wenn letzterer wahr ist. Wenn eine C Funktion normal oder als Teil des Zurückverfolgungsprozeßes aufgerufen wird, gibt es keinen aktiven Auswahlpunkt mehr. Wenn die Funktion, die von der Zurückverfolgung aufgerufen wird, rekursiv ist, muß ein Auswahlpunkt neu erstellt werden.
  • Analyse der Datenobjekte in Prolog
  • Dieser Satz mit Funktionen beschreibt ein Objekt in Prolog, wählt Unterobjekte innerhalb eines Objekts in Prolog aus, übersetzt Objekte in Prolog in C und C Variablen in Objekte in Prolog und unifiziert eine Vielzahl von Objekten in Prolog.
  • Prolog_TYPE(Prolog_OBJECT)
  • Diese Funktion führt die Art eines Prolog_OBJECT zurück. Die vollständige Liste mit Arten in Prolog, wie dies von Prolog_TYPE verstanden wird, führt einen Wert zurück, der zu Prolog_TYP_OTHER gehört. Eine unbekannt Art führt einen Wert zurück, der zu Prolog_TYP_VARIABLE gehört. Eine normale Variable in Prolog führt einen Wert zurück, der zu Prolog_TYP_NIL gehört. Das NIL Atom führt einen Wert zurück, der zu Prolog_TYP_ATOM gehört. Ein anderes Atom als NIL führt einen Wert zurück, der zu Prolog_TYP_STRING gehört. Eine Zeichenkette führt einen Wert zurück, der zu Prolog_TYP_INT gehört. Eine Fließkomma-Zahl führt einen Wert zurück, der zu Prolog_TYP_LONGINT gehört. Eine rationale Zahl führt einen Wert zurück, der zu Prolog_TYP_RATIONAL gehört. Ein Rahmen führt einen Wert zurück, der zu Prolog_TYP_SKELETON gehört. Ein erweiterter Rahmen führt einen Wert zurück, der zu Prolog_TYP_EXTENDEDSKELETON gehört. Ein Listenpaar führt einen Wert zurück, der zu Prolog_TYP_List gehört.
  • Prolog_FUNCTOR(Prolog_OBJECT)
  • Diese Funktion führt einen Functor eines Prolog_Object im Prolog_Object Format zurück.
  • Wenn das Objekt von der Art Prolog_TYP_SKELETON oder von der Art Prolog_TYP_EXTENDEDSKELETON ist, führt die Funktion den Begriff Functor zurück.
  • Wenn das Objekt von der Art Prolog_TYP_LIST ist, führt die Funktion das Atom "." zurück.
  • Wenn das Objekt der NULL Zeiger ist, führt die Funktion den Functor des externen Prädikats zurück, das zum Aufruf der C Funktion benutzt wurde.
  • Sonst setzt die Funktion den Error_Code auf Prolog_ERR_SYNTAX und führt den NULL Zeiger zurück.
  • Prolog_ARITY(Pralog_OBJECT)
  • Diese Funktion führt die Arity eines Prolog_Object im C int Format zurück.
  • Wenn das Objekt von der Art Prolog TYP SKELETON oder Prolog_TYP_EXTENDEDSKELETON ist, führt die Funktion den Begriff Arity zurück.
  • Wenn das Objekt von der Art Prolog_TYP_LIST ist, führt die Funktion die Zahl zwei zurück.
  • Wenn das Objekt der NULL Zeiger ist, führt die Funktion die Arity des externen Prädikats zurück, die benutzt wurde, um die C Funktion aufzurufen.
  • Sonst setzt die Funktion den Error_Code auf Prolog_ERR_SYNTAX und führt den Wert a -1 zurück.
  • Prolog_PREFIX(Prolog_OBJECT)
  • Diese Funktion führt das Präfix eines Prolog_Object im Prolog_Object Format zurück.
  • Wenn das Objekt der NULL Zeiger ist, führt dieses das Präfix des externen Prädikats zurück, das zum Aufruf der C Funktion benutzt wurde.
  • Sonst setzt die Funktion den Error_Code auf Prolog_ERR_SYNTAX und führt den NULL Zeiger zurück.
  • Prolog_ARG(Prolog_OBJECT,RANK)
  • Diese Funktion führt das Unterobjekt eines Prolog_Object entsprechend dem Rang im Prolog_Object Format zurück. Das erste Unterobjekt hat Rang 0.
  • Wenn das Objekt von der Art Prolog_TYP_SKELETON oder Prolog_TYP_EXTENDEDSKELETON ist, führt dieses das Unterobjekt entsprechend dem Rang zurück.
  • Wenn das Objekt von der Art Prolog_TYP_LIST und der Rang entweder 0 oder 1 ist, führt die Funktion das Subobjekt entsprechend dem Rang zurück.
  • Sonst setzt die Funktion den Error_Code auf Prolog_ERR_SYNTAX und führt den NULL Zeiger zurück.
  • Prolog_LIST(Prolog_OBJECT,RANK,SELECTION)
  • Diese Funktion führt das Element entsprechend dem Rang in einer Liste mit Prolog_Object im Prolog_Object Format zurück. Das erste Element hat Rang 0.
  • Wenn das Objekt von der Art Prolog_TYP_LIST ist und die Auswahl Prolog_LST_VALUE ist, führt die Funktion das Element entsprechend dem Rang in der Liste zurück.
  • Wenn das Objekt von der Art Prolog_TYP_LIST ist und die Auswahl Prolog_LST_NEXT ist, führt die Funktion das Listenpaar entsprechend Rang+1 zurück.
  • Wenn das Objekt von der Art Prolog_TYP_LIST ist und die Auswahl Prolog_LST_CURRENT ist, führt die Funktion das Listenpaar entsprechend dem Rang zurück.
  • Sonst setzt die Funktion den Error_Code auf Prolog_ERR_SYNTAX und führt den NULL Zeiger zurück.
  • Prolog_LIST_LENGTH(PROLOG_OBJECT)
  • Diese Funktion zählt die Anzahl von Listenpaaren, die in Form einer Liste verkettet sind und führt diese zurück. Die Zählung ist null, wenn das Prolog_Object kein Listenpaar ist. Die Zählung wird abgeschlossen, wann immer die Funktion mit einem Nicht-Listenpaar als das zweite Feld eines Listenpaares (die abschließende Null einer normalen Liste oder irgendeiner anderen Art in Prolog, ausgenommen das Listenpaar) präsentiert wird.
  • Prolog_COMP_FLOAT (FLOATING_POINT,FLOATING_POINT)
  • Diese Funktion führt einen nicht Nullwert zurück, wenn die beiden Fließkomma-Zahlen in C Doppelformat enger zusammen sind als der aktuelle fuzz value in Prolog.
  • Prolog_CONSTANT(RANK)
  • Diese Funktion führt das konstante Objekt, das in dem Satz von PROCONS Makros definiert ist, entsprechend dem Rang zurück. Das erste konstante Objekt hat Rang 0. Wenn die Konstante eine PROCONS LIST oder ein PROCONS SKEL ist, wird ein neues Listenpaar, das mit Variablen in Prolog oder einem neuen Begriff in Prolog, mit den richtigen Functor und Arity und Prolog Variablen als Argumente gefüllt wird, im globalen Stapelspeicher zugeordnet.
  • Diese Funktion liefert auch konstante Objekte mit vordefinierten Werten entsprechend dem Rang:
  • Prolog_CST_NIL Die spezielle Atomnull in Prolog,
  • Prolog_CST_LIST Ein neu zugeordnetes Listenpaar mit variablen Argumenten,
  • Prolog_CST_EMPTY Leere Zeichenkette in Prolog.
  • Wenn der globale Stapelspeicher überläuft, wird der Error_Code in Prolog_ERR_GLOBAL gesetzt und der NULL Zeiger zurückgeführt.
  • Prolog_CONVERT_INT(Prolog_OBJECT)
  • Diese Funktion konvertiert die Objekte in C Ganzzahlformat und führt die Ganzzahl zurück.
  • Wenn das Objekt von der Art Prolog_TYP_INT ist, führt dieses den Ganzzahl-Formatwert des Objekts zurück.
  • Sonst setzt die Funktion den Error_Code auf Prolog_ERR_SYNTAX und führt einen Nullwert zurück.
  • Prolog_CONVERT_FLOAT(Prolog_OBJECT)
  • Diese Funktion konvertiert das Objekt in C Doppelformat und führt das Doppel zurück.
  • Wenn das Objekt von der Art Prolog_TYP_FLOAT ist, führt dieses den doppelten Formatwert des Objekts zurück.
  • Wenn das Objekt von der Art Prolog_TYP_LONGINT oder Prolog_TYP_RATIONAL ist, führt dieses den konvertierten, doppelten Formatwert des Objekts zurück.
  • Sonst setzt dieses den Error_Code in Prolog_ERR_SYNTAX und führt einen Nullwert zurück.
  • Prolog_CONVERT_STRING(Prolog_OBJECT)
  • Diese Funktion konvertiert das Objekt in C char * Format und führt das char * zurück.
  • Wenn das Objekt von der Art Prolog_TYP_STRING ist, führt die Funktion den konvertierten char * Formatwert des Objekts zurück.
  • Wenn das Objekt von der Art Prolog_TYP_ATOM oder Prolog_TYP_NIL ist, führt dieses den konvertierten char * Formatwert des Drucknamens des Objekts zurück.
  • Wenn der lokale Stapelspeicher überläuft, setzt dieser den Error_Code auf Prolog_ERR_LOCAL und führt den NULL Zeiger zurück.
  • Sonst setzt dieses den Error_Code auf Prolog_ERR_SYNTAX und führt einen NULL Zeiger zurück.
  • Prolog_CONVERT_Prolog(TYPE_ORG,Prolog_OBJECT OR C OBJECT,TYPE_DEST)
  • Diese Funktion konvertiert das Objekt in Prolog_Object von der Art Type_Dest und führt das konvertierte Prolog_Object zurück. Type_Org ist der Prolog_Type des Prolog_Object oder kann als Prolog_TYP_OTHER spezifiziert werden. Wenn das Objekt jedoch ein C Objekt ist, muß Type_Org spezifiziert und zu dem folgenden Satz gehören.
  • Prolog_TYP_BINARYSTRING Eine Zeichenkette im C char * Format,
  • Prolog_TYP_BINARYINT Eine ganze Zahl im C int format und
  • Prolog_TYP_BINARYFLOAT Eine Fließkomma-Zahl in C Doppelformat.
  • Die unterstützten Konvertierungen werden nachstehend aufgelistet.
  • Prolog_TYP_BINARYSTRING to Prolog_TYP_STRING,
  • Prolog_TYP_BINARYSTRING to Prolog_TYP_ATOM,
  • Prolog_TYP_BINARYSTRING to Prolog_TYP_NIL,
  • Prolog_TYP_STRING to Prolog_TYP_STRING,
  • Prolog_TYP_STRING to Prolog_TYP_ATOM,
  • Prolog_TYP_STRING to Prolog_TYP_NIL,
  • Prolog_TYP_ATOM to Prolog_TYP_ATOM,
  • Prolog_TYP_ATOM to Prolog_TYP_STRING,
  • Prolog_TYP_NIL to Prolog_TYP_NIL,
  • Prolog_TYP_NIL to Prolog_TYP_STRING,
  • Prolog_TYP_INT to Prolog_TYP_INT,
  • Prolog_TYP_BINARYINT to Prolog_TYP_INT,
  • Prolog_TYP_FLOAT to Prolog_TYP_FLOAT, und
  • Prolog_TYP_BINARYFLOAT to Prolog_TYP_FLOAT.
  • Wenn der globale Stapelspeicher überläuft, setzt die Funktion den Error_Code auf Prolog_ERR_GLOBAL und führt den NULL Zeiger zurück. Sonst setzt die Funktion den Error_Code auf Prolog_ERR_SYNTAX und führt einen NULL Zeiger zurück.
  • Prolog_UNIFY(Prolog_OBJECT,Prolog_OBJECT)
  • Diese Funktion unifiziert die beiden Objekte. Wenn dies gelingt, wird die unifizierte Version oder das erste Prolog_Object zurückgeführt. Wenn dies scheitert, wird die Zurückverfolgung durchgeführt. Aus Gründen der Leistung werden einfache, nicht eingefrorene Variablen in Prolog, Ganzzahlen in Prolog, Atome und Ketten dynamisch verarbeitet. Andere Arten können jedoch eine Kontextschaltung von C zu Prolog veranlassen und den kompletten Unifizierer in Prolog aufrufen, bevor eine Kontextschaltung zurück zu C erfolgt.
  • Wenn der Trail-Stapelspeicher überläuft, setzt die Funktion den Error_Code auf Prolog_ERR_TRAIL und führt den NULL Zeiger zurück.
  • Bestehende Anwendungen
  • Für bestehende Anwendungen, die Kommunikationen in Prolog erfordern, gibt es von solchen Anwendungen in Prolog auch eine Schnittstelle. Wie bei FORTRAN ersichtlich, ist die Schnittstelle eine TEXT Datei, Z1COMPF TEXT, die in Figur 33 abgebildet ist. Die Schnittstelle liefert eine "INTEGER function", Prolog genannt. Das INTEGER Resultat ist der Rückkehrcode der Anforderung. FORTRAN CALL FORMAT SAMPLE Wir erklären die externe Funktion INTEGER Prolog Wir reservieren Platz für den Rückkehrcode INTEGER RETCODE Wir benutzen einen Musteraufruf, um das Format zu zeigen RETCODE = Prolog('START', 'Prolog', 'Prolog WS', 'REUSE', '') END OF FORTRAN CALL FORMAT SAMPLE MERKE: Da Fortran keine leere Zeichenketten unterstützt, muß man die leeren Zeichenketten durch Ketten mit einem Leerzeichen ersetzen.
  • C Schnittstelle in Prolog
  • Die C Schnittstelle ist in einer TEXT Datei, Z1COMPC TEXT, abgebildet, die in Figur 33 dargestellt wird. Diese Schnittstelle liefert eine "int function", Prolog genannt. Das int Resultat ist der Rückkehrcode der Anforderung. C CALL FORMAT SAMPLE Externe Funktion erklären enthält < Prolog.H> Platz für den Rückkehrcode reservieren int Retcode Einen Musteraufruf benutzen, um das Format zu zeigen Retcode = Prolog("START", "Prolog", "PrologWS", "REUSE","") END OF C CALL FORMAT SAMPLE
  • COBOL
  • Die Schnittstelle von Cobol in Prolog ist in der Ursprungsliste für Z1COMPB TEXT abgebildet, die in Figur 35 gezeigt wird. Der Rückkehrcode der Anforderung wird als erstes Argument der CALL "Prolog" Anweisung zurückgeführt. Wo C und Fortran Zeichenketten benutzen können, muß COBOL ebenfalls die Länge der Zeichenkette zusammen mit der Zeichenkette selbst liefern. COBOL CALL FORMAT SAMPLE Wir reservieren Platz für alle Argumente RETCODE PIC S9(09) BINARY START-STRCT START-LGTH PIC 9 BINARY VALUE 5 START-STR PIC X VALUE "START" Prolog-STRCT. Prolog-LGTH PIC 9 BINARY VALUE 5 Prolog-STR PIC X VALUE "Prolog" PrologWS-STRCT Prolog-LGTH PIC 9 BINARY VALUE 7 Prolog-STR PIC X VALUE "PrologWS" REUSE-STRCT REUSE-LGTH PIC 9 BINARY VALUE 5 REUSE-STR PIC X VALUE "REUSE" OPTION-STRCT OPTION-LGTH PIC 9 BINARY VALUE 0 * Sample Call to Show the Format CALL "Prolog" USING RETCODE, START-STRCT, Prolog-STRCT, PrologWS-STRCT, REUSE-STRCT, OPTION-STRCT. END OF COBOL CALL FORMAT SAMPLE
  • Die abschließende Erörterung benutzt die C Syntax als Komunikationsmedium.
  • Die Sprachschnittstelle in Prolog liefert vier Basisbefehle:
  • START initialisiert Prolog und lädt, wenn nicht schon geladen, einen neuen Arbeitsbereich in einer neuen Sitzung und aktiviert das anfängliche Ziel des Arbeitsbereichs.
  • STOP beendet eine Sitzung in Prolog und gibt den zugehörigen Speicher frei.
  • CALL läßt ein Prädikat in Prolog mit Daten laufen, die aus dem Aufrufprogramm konvertiert wurden, und, wenn das Prädikat gelingt, konvertiert Resultate zurück in das Aufrufprogramm.
  • RECALL verlangt die nächste Lösung des letzten CALL Befehls und, wenn das Prädikat gelingt, werden Resultate von dem Aufrufprogramm in die Daten zurückkonvertiert, die von dem Original CALL Befehl geliefert wurden.
  • START COMMAND
  • Der Befehl START verlangt 5 Argumente, allesamt Zeichenketten. Die Syntax wird nachstehend geliefert. C INTERFACE START COMMAND Retcode = Prolog("START", Token, Workspace, Share,Options); END OF C INTERFACE START COMMAND
  • wobei TOKEN eine Sitzung ist, die aus acht Zeichen oder weniger besteht, die benutzt werden, um die Sitzung in Prolog zu identifizieren, wo das Programm die Befehle CALL, RECALL und STOP unterbreitet.
  • WORKSPACE ist der Name eines Arbeitsbereichs, der aus acht Zeichen oder weniger besteht, welcher eine bestehende Datei der Dateiart Prolog WS identifiziert. Wenn die Anwendung der anfängliche Original-Arbeitsbereich ist, der von Prolog geliefert wird, lautet der Name Prolog WS.
  • SHARE ist eine Auswahlkette, die aus 8 Zeichen oder weniger besteht, die den Wert NEW oder REUSE nehmen muß. Wenn die Kette leer ist, wird die Vorgabe (NEW) genommen.
  • OPTIONS ist eine Zeichenkette, welche die Optionen enthält, die von dem START Befehl an LProlog EXEC geliefert werden.
  • Wenn die NEW Share Auswahl benutzt wird, stoppt der START Befehl irgendeine Sitzung mit dem Namen Token. Dann gibt START einen CMS Befehl von der Art LProlog NAME Token WS Workspace Options aus. Während der Verarbeitung von LProlog EXEC, wird Prolog initialisiert. Wenn nicht schon bereits geschehen, dann baut der Befehl eine Sitzung mit dem Namen Token mit einem Arbeitsspeicher auf, der aus Prolog WS mit irgendeiner Option, die erforderlich sein kann, gelesen wird.
  • Der START Befehl führt den Rückkehrcode des LProlog Befehls als seinen eigenen Rückkehrcode zurück, oder ein Fehlercode in Prolog zeigt an, daß die Befehlssyntax ungültig war, oder ein externer Speicherausfall in Prolog zeigt an, wenn die Speicherzuordnung unbedingt den Aufbau des gescheiterten LProlog Befehls verlangt.
  • STOP
  • Der Befehl STOP verlangt zwei Zeichenargumente. Die Syntax ist C INTERFACE STOP COMMAND Retcode = Prolog("STOP", Token); END OF C INTERFACE STOP COMMAND
  • wobei TOKEN die Sitzung Token mit acht Zeichen oder weniger ist, welche die Sitzung in Prolog im START Befehl identifiziert.
  • Der STOP Befehl gibt einen CMS Befehl in der Form NUCXDROP Token aus. Dann wird während der Verarbeitung des NUCXDROP Befehls die Sitzung mit dem Namen Token beendet und deren Speicher zurückverlangt. Wenn es keine weitere aktive Sitzung in Prolog gibt, wird Prolog selbst aus dem Speicher entfernt.
  • Der STOP Befehl führt den Rückkehrcode des NUCXDROP Befehls wie seinen eigenen Rückkehrcode zurück oder einen Syntaxfehler in Prolog, wenn der Befehl ungültig war.
  • CALL Befehl
  • Der Befehl CALL erfordert Argumente, die wenigstens aus fünf Zeichen bestehen, wobei die ersten fünf Zeichenketten sind. Die Syntax ist nachstehend dargestellt. C INTERFACE CALL COMMAND Retcode = Prolog("CALL", Token, Prefix, predicate, Descriptor, Arguments ...); END OF C INTERFACE CALL COMMAND
  • wobei TOKEN die aus acht Zeichen bestehende Sitzung Token ist, die lediglich die Sitzung in Prolog im START Befehl identifiziert.
  • PREFIX ist das Präfix des Prädikats, das aufgerufen wird. Wenn als leere Kette geliefert, erhält das Prädikat kein Präfix. In diesem Fall wird das Prioritätsprädikat des Prädikatsnamens aufgerufen; Prädikat ist der Name des Prädikats, das aufzurufen ist, eine Zeichenkette, empfindlicher Fall.
  • DESCRIPTOR ist die Deskriptor-Zeichenkette von der Konvertierung der Ein- und Ausgabeargumente. Diese kann leer sein, wie im Fall des Null-Arity-Prädikats und in diesem Fall dürfen keine Argumente hinter dem Deskriptor im Aufruf in Prolog sein.
  • ARGUMENTS sind null oder mehr Datenargumente, die in Datenstrukturen in Prolog konvertiert werden müssen, bevor das Prädikat aufgerufen wird und müssen als Argumente dieses Prädikats übergeben werden.
  • Für Resultat-Argumente empfängt das Prädikat Variable in den entsprechenden Positionen, und wenn das Prädikat gelingt, werden die Daten in Prolog, die in diese Variablen eingesetzt wurden, in das Format des Aufrufprogramms zurückkonvertiert.
  • Der CALL Befehl läßt das Prädikat in Prolog oder das Präfix laufen: Prädikat mit Eingabe-Argumenten, die von dem Aufrufprogramm konvertiert werden und mit Ausgabe-Argumenten, die als Variable geliefert werden. Wenn ein Fehler in Prolog auftritt, dann führt der CALL Befehl den Fehlercode als Rückkehrcode zurück. Wenn das Prädikat scheitert, dann führt der CALL Befehl seinen eigenen Rückkehrcode zurück.
  • Wenn das Prädikat gelingt, dann konvertiert der CALL Befehl die Ausgabe-Argumente aus den Daten in Prolog, die mit den Variablen unifiziert wurden, zurück und führt Null als seinen Rückkehrcode zurück.
  • Wenn der CALL Befehl ungültig ist, wird ein Syntaxfehler in Prolog als eigener Rückkehrcode zurückgeführt.
  • RECALL COMMAND
  • Der Befehl RECALL benötigt zwei Zeichenargumente. Die Syntax ist nachstehend abgebildet: C INTERFACE RECALL COMMAND Retcode = Prolog("RECALL", Token); C INTERFACE RECALL COMMAND
  • wobei TOKEN die aus acht Zeichen bestehende Sitzungskennzeichnung ist. Der RECALL Befehl verlangt die nächste Lösung aus dem letzten CALL Befehl. Dieser führt die gleichen Rückkehrcodes als CALL Befehle zurück und führt die Resultate der Lösung zurück, wenn ein anderes Mal das Prädikat in den Ausgabe-Argumenten gelingt, die von dem CALL Befehl geliefert werden.
  • Call Descriptor
  • Der Deskriptor ist eine Zeichenkette mit null oder mehreren Argumenten. Dieser benutzt einen Teilsatz der PROARGS Syntax. Die folgenden Fälle der PROARGS Syntax können im CALL Deskriptor nicht benutzt werden:
  • Datenarten 04, AN und
  • IO Steuerungen V, R, A.
  • Ein- und Ausgaben in IO Steuerungen gehören ebenfalls zu dem aufgerufenen Prädikat in Prolog und nicht zu dem aufgerufenen, kompilierten sprachexternen Prädikat. Zwei Formate (Normaler Deskriptor und C struct Deskriptor) des PROARGS Makros sind gültig.
  • Datenarten B1, B2, B4, I1, I2, I4, E4, E8, J4, J8, CN, C0, I, O, IO;
  • und
  • Dimensions-Deskriptoren N, ARGN.
  • Wenn eine Dimension als ein ARGN beschrieben wird, dann muß das N entsprechende Argument vom Datentyp I4 sein, IO Steuerung muß I sein und mit seinem korrekten Wert als Programmdaten geliefert werden. Das Prädikat empfängt sowohl die Anordnung in Form einer Liste; oder eine Liste aus Listen für mehrdimensionsierte Anordnungen, als auch die Dimensionen als skalare Zahlen. Die Dimensionszahlen werden an das Prädikat übergeben; während in Prolog in der kompilierten Sprachschnittstelle das Aufrufprädikat in Prolog diese nicht für die Eingabeanordnungen liefern muß. In der kompilierten Sprache in der Schnittstelle in Prolog werden die Dimensionszahlen an das Prädikat weitergeleitet, ob die Anordnungen eingegeben werden und anschließend als Listen geliefert oder ausgegeben und als Variablen geliefert werden.
  • Das Prädikat ist erforderlich, um Ausgabeanordnungen exakt in der Größe aufzubauen, die von den Dimensionszahlen geliefert wird. Wenn dies nicht erfolgt, scheitert die Rückkonvertierung an einem Fehler.
  • Von Prolog zum externen Prozeß
  • Die Kommunikationslogik von Prolog zu einem externen Prozeß ist in den Figuren 36A bis 36C dargestellt. Die Ausführung beginnt bei 970, wo das Prädikat my_stupid mit einem Argument, das in dem Funktionsblock abgebildet ist, als External Non- Connected definiert wird. Seine Ausführungsadresse zeigt auf ATTACHF im Systembereich von Prolog. Im Funktionsblock 971 trifft Prolog zuerst auf eine Referenz in my_stupide (3). Die Steuerung wird zur Verarbeitung der Referenz in einem externen Prozeß an ATTACHF übergeben. Die Datei, die den Dateinamen enthält, unter dem der externe Prozeß aufgebaut wurde, wird in Funktionsblock 972 für den besonderen externen Prozeß gesucht, den Prolog auszuführen wünscht. Die Datei enthält den Dateinamen, wo der externe Prozeß vom Benutzer definiert wird. Diese enthält eine Prädikatliste, die von einer Vielzahl von MACRO PRODECE in MYFORTO ASSEMBLE erstellt wurde. Informationen, die zur Ausführung des externen Prozesses erforderlich sind, sind in der Liste gespeichert. Diese Information enthält die Ausführungsadresse des externen Prozesses.
  • In Funktionsblock 973 wird der externe Prozeß zum Speicher gebracht, wenn dieser nicht zuvor geladen wurde. In Funktionsblock 974 wird anschließend die Kopfzeile des externen Prozesses, der durch MACRO PROINI in MYFORT0 ASSEMBLE (zuvor erörtert) erstellt wurde, überprüft. Die Kopfzeile enthält eine Balkenüberschrift und eine Versionsnummer von Prolog. Die Überschrift wird auf korrekte Identifizierungsinformationen für den externen Prozeß getestet, und die Versionsnummer wird abgefragt, um sicherzustellen, daß die aktuelle Version in Prolog aktiv ist.
  • In Funktionsblock 975 wird die Prädikatsliste gesucht, um die Adreßinformation für den externen Prozeß zu erhalten. Die Prädikatsliste wurde zuvor von einem oder mehreren MACRO PRODECE in MYFORT0 ASSEMBLE erstellt. STUPID ist der externe Fortran Name, da STUPIDE der Name ist, der als drittes Argument von ext_func. benutzt wird. Dann wird in Funktionsblock 976 das Prädikat my_stupide(*) als external connected definiert, dessen Verbindungsadresse wird durch den Verbindungscode in der Prädikatsliste ausgetauscht und ATTACHF verzweigt mit der Verbindungsadresse. Die ATTACHF Verarbeitung ist somit abgeschlossen.
  • In Funktionsblock 977 speichert der Verbindungscode die Adresse des Eingabepunktes des externen Prozesses, die Hauptadresse in Fortran und die Adresse der PROARGS Tabelle in einem Satz vordefinierter Register. Dann wird die Steuerung in einer vordefinierten Adresse ITFFORT 2 an Prolog zurückgeführt. Die Konvertierung von Argumenten in Prolog in das Format, das der externe Prozeß erwartet, wird durch die PROARGS Tabelle verwaltet. In Funktionsblock 980 wird eine Integritätsüberprüfung in der PROARGS Tabelle durchgeführt. Dann wird der Prädikataufruf geprüft, um die Argumentenzählung zu überprüfen.
  • In Funktionsblock 982 wird jedes Argument über die Konvertierungsschleife 983 übergeben, um Argumente aus Prolog in das Format zu konvertieren, das der externe Prozeß erwartet. Dann wird jedes Ausgabe-Argument dem Funktionsblock 984 und der Verarbeitungsschleife 985 zugeordnet. Die Information in der PROARGS Tabelle verwaltet diese Verarbeitung.
  • Im Entscheidungsblock 986 wird der Status der externen Prozeßumgebung abgefragt und aufgerufen, wenn dieser noch nicht aktiv ist, wie dies in Funktionsblock 987 gezeigt wird. Sobald die externe Umgebung aktiv ist, wird der spezifische externe Prozeß mit der konvertierten Parameterliste aktiviert, die dieser erwartet. Wenn der externe Prozeß die Ausführung beendet hat, werden die Ausgabe-Argumente in das Format in Prolog zurückkonvertiert, wie dies in Funktionsblock 992 dargestellt ist. Schließlich wird die Steuerung an Prolog zurückgeführt und das Prädikat gelingt, wie dies in Funktionsblock 993 dargestellt ist.
  • Vom externen Prozeß zu Prolog
  • Die Kommunikationslogik von Prolog zu einem externen Prozeß ist in den Figuren 37A - 37C abgebildet. Mit Bezug auf Figur 37A beginnt die Ausführung bei 1000, wobei die Anwendung Prolog unter dem Namen APPL mit einem Arbeitsspeicher mit dem Namen APPL starten möchte. Die Verbindungsroutine in Prolog tastet den Befehl ab, erkennt START und extrahiert Anwendungsund Arbeitsspeichername. Die Verbindungsroutine startet Prolog, indem der Befehl ausgegeben wird, der in Funktionsblock 1010 im Betriebssystem dargestellt ist und führt die Steuerung zur Anwendung zurück.
  • Die Anwendung möchte das Prädikat 'prefix:predicate' laufen lassen und diesem die konvertierten Argumente geben, die in Funktionsblock 1012 abgebildet sind. Die Konvertierung basiert auf der Information in den Deskriptor-Tabellen und dem Format in dem PROARGS MACRO. Die Verbindungsroutine tastet Befehle ab und erkennt einen CALL. Die Verbindungsroutine formatiert einen Systemaufruf an Prolog, wie dies in Funktionsblock 1016 über einen Supervisor-Aufruf erfolgt, der den Befehl APPL HLL und die Argumente Präfix, Prädikat, Deskriptor und Argumente benutzt.
  • Der Systemaufruf APPL HLL in Prolog ruft die Konvertierungsverarbeitung auf, um die Argumente aus dem externen Prozeß in das interne Format in Prolog zu konvertieren, wie dies in Funktionsblock 1018 abgebildet ist. Der Funktionsblock 1020 kehrt zur Konvertierungsverarbeitung zurück, um die Konvertierung von jedem der Argumente zu erleichtern. Sobald die Eingabe-Argumente konvertiert sind, wird das Prädikat ausgeführt, wie dies in Funktionsblock 1025 dargestellt ist. Dann, wenn das Prädikat gelingt, wird jedes Ausgabe-Argument in das externe Prozeßformat zurückkonvertiert, wie dies in Funktionsblock 1034 gezeigt wird; die Schleife bei 1036 und die Steuerung werden zum externen Prozeß zurückgeführt. Die Rückkonvertierung in den externen Prozeß benutzt zur korrekten Formatierung die Deskriptor-Tabelle. Wenn das Prädikat scheitert, dann schließt der Systemaufruf in Prolog bei 1032 ab, und führt die Steuerung mit einem Fehlercode zum externen Prozeß zurück.
  • Der externe Prozeß erhält die nächste Lösung aus dem vorhergehenden Aufruf über die Verarbeitung, die in Funktionsblock 1040 dargestellt ist. Der Verbindungscode gibt einen Systemaufruf in Prolog aus, wie dies in Funktionsblock 1042 gezeigt wird. Der vorhergehende Satz mit Verbindungsinformationen wird benutzt, um mit Prolog zu kommunizieren. Somit läßt das Prolog-System das vorhergehende Prädikat wiederholen, wie dies in Funktionsblock 1044 gezeigt wird. Dann werden, wenn das Prädikat gelingt, wie dies in dem Entscheidungsblock 1046 überprüft wurde, die Ausgabe-Argumente in Funktionsblock 1052 in das Format des externen Prozesses zurückkonvertiert, und das Prolog-System führt die Steuerung zum externen Prozeß zurück. Wenn das Prädikat scheitert, dann beendet Prolog den Systemaufruf und sendet einen Fehlercode.
  • Wenn der externe Prozeß die Verarbeitung in Prolog abschließen und ein Clean-up der Sitzung durchführen möchte, gibt dieser einen STOP Befehl aus, wie dies in Funktionsblock 1056 dargestellt ist. Die Verbindungsroutine in Prolog erkennt das STOP und extrahiert den Sitzungsnamen APPL. Die Verbindungsroutine beendet die Sitzung APPL, indem der Befehl, der in Funktionsblock 1058 gezeigt wird, an das Betriebssystem ausgegeben wird.

Claims (8)

1. Ein Verfahren zum Betrieb eines Computersystems, das einen Prozessor und einen Speicher hat, um Prologprogramme mit Prädikaten zu verarbeiten, wobei die Verfahren Schritte enthalten, um
a) mittels dem Prozessor ein Prädikat in einem Satz von Befehlen, der im Speicher des Computersystems gespeichert ist, einschließlich eines vereinfachten Befehls, der aus einer Adresse eines Objektes besteht und vorangegangene Befehle hat, zu codieren;
b) mittels dem Prozessor einen implizierten Operationsschlüssel für den vereinfachten Befehl aus den vorangegangenen Befehlen zu bestimmen, indem eine Finite- Status-Automatisierung mit Modi zum Lesen, Schreiben, Aufbauen und Argumentieren benutzt wird, um die vorangegangenen Befehle zu verfolgen und den implizierten Operationsschlüssel als unify_constant in den Lese- und Schreibmodi, put_constant im Aufbaumodus und get_constant im Argumentiermodus auszuwählen; und
c) mittels dem Prozessor den implizierten Operationsschlüssel auszuführen, indem die Adresse des Objektes als Parameter benutzt wird.
2. Ein Verfahren wie in Anspruch 1 angemeldet, wobei der Speicher eine Vielzahl von Prologregistern enthält und der Schritt zum Codieren enthält:
Speicherung von wenigstens einem unify_stack Befehl und einem zugehörigen Argument, wobei der unify_stack Befehl kein Prologregister spezifiziert hat;
Speicherung von wenigstens einem Pop_structure F Befehl, wobei der Pop_structure F Befehl kein Prologregister spezifiziert hat;
wobei die unify_stack und Pop_structure F Befehle anstelle der unify_variable und get_structure Befehle mit spezifizierten Prologregistern verwendet werden, und die Anzahl der Prologregister-Referenzen in dem für das Prädikat gespeicherten Befehlssatz reduziert wird.
3. Ein Verfahren wie in Anspruch 2 angemeldet, wobei der Speicher einen Stapelspeicher enthält und das Verfahren Schritte enthält, um
den unify_stack Befehl auszuführen, indem dessen zugehöriges Argument in einem Stapelspeicher gespeichert wird; und
einen Pop_structure F Befehl auszuführen, indem ein Wort aus dem Stapelspeicher entnommen wird;
wobei die Anzahl von Prologregister-Referenzen in dem für das Prädikat ausgeführten Befehlssatz reduziert wird.
4. Ein Verfahren wie in Anspruch 1 angemeldet, wobei der Schritt zum Codieren das Speichern der Adresse des Objektes mit einem ersten Bit gleich null enthält und das Speichern aller nichtvereinfachten Befehle mit einem ersten Bit gleich eins enthält, und somit den vereinfachten Befehl von nichtvereinfachten Befehlen unterscheidbar macht.
5. Ein Computersystem zur Verarbeitung von Prologprogrammen mit Prädikaten, wobei das Computersystem enthält:
einen Prozessor;
einen Speicher;
Mittel, um mit dem Prozessor ein Prädikat in einem Satz von Befehlen, der im Speicher des Computersystems gespeichert ist, einschließlich eines vereinfachten Befehls, der aus einer Adresse eines Objektes besteht und vorangegangene Befehle hat, zu codieren;
Mittel, um mit dem Prozessor einen implizierten Operationsschlüssel für den vereinfachten Befehl aus den vorangegangenen Befehlen zu bestimmen, indem ein Finite-Status- Automatisierung mit Modi zum Lesen, Schreiben, Aufbauen und Argumentieren benutzt wird, um die vorangegangenen Befehle zu verfolgen und den implizierten Operationsschlüssel als unify_constant in den Lese- und Schreibmodi, put_constant im Aufbaumodus und get_constant im Argumentiermodus auszuwählen; und
Mittel, um mit dem Prozessor den implizierten Operationsschlüssel auszuführen, indem die Adresse des Objektes als Parameter benutzt wird.
6. Ein System wie in Anspruch 5 angemeldet, wobei der Speicher eine Vielzahl von Prologregistern enthält und die Mittel zum Codieren enthalten:
Mittel zur Speicherung von wenigstens einem unify_stack Befehl und einem zugehörigen Argument, wobei der unify_stack Befehl kein Prologregister spezifiziert hat;
Mittel zur Speicherung yon wenigstens einem Pop_structure F Befehl, wobei der Pop_structure F Befehl kein Prologregister spezifiziert hat;
wobei die unify_stack und Pop_structure F Befehle anstelle der unify_variable und get_structure Befehle mit spezifizierten Prologregistern verwendet werden, und die Anzahl der Prologregister-Referenzen in dem für das Prädikat gespeicherten Befehlssatz reduziert wird.
7. Ein System wie in Anspruch 6 angemeldet, wobei der Speicher einen Stapelspeicher enthält und das System enthält:
Mittel, um den unify_stack Befehl auszuführen, indem dessen zugehöriges Argument in einem Stapelspeicher gespeichert wird; und
Mittel, um einen Pop_structure F Befehl auszuführen, indem ein Wort aus dem Stapelspeicher entnommen wird;
wobei die Anzahl von Prologregister-Referenzen in dem für das Prädikat ausgeführten Befehlssatz reduziert wird.
8. Ein System wie in Anspruch 5 angemeldet, wobei die Mittel zum Codieren das Speichern der Adresse des Objektes mit einem ersten Bit gleich null und das Speichern aller nichtvereinfachten Befehle mit einem ersten Bit gleich eins enthalten, und somit den vereinfachten Befehl von nichtvereinfachten Befehlen unterscheidbar macht.
DE69023196T 1989-08-14 1990-06-26 Implizite Prologargumente. Expired - Lifetime DE69023196T2 (de)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US39363089A 1989-08-14 1989-08-14

Publications (2)

Publication Number Publication Date
DE69023196D1 DE69023196D1 (de) 1995-11-30
DE69023196T2 true DE69023196T2 (de) 1996-06-13

Family

ID=23555569

Family Applications (1)

Application Number Title Priority Date Filing Date
DE69023196T Expired - Lifetime DE69023196T2 (de) 1989-08-14 1990-06-26 Implizite Prologargumente.

Country Status (3)

Country Link
EP (1) EP0417054B1 (de)
JP (1) JPH0623957B2 (de)
DE (1) DE69023196T2 (de)

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US3754218A (en) * 1970-05-29 1973-08-21 Nippon Electric Co Data handling system with relocation capability comprising operand registers adapted therefor
CA1114518A (en) * 1977-10-25 1981-12-15 William D. Strecker Central processor unit for executing instructions with a special operand specifier

Also Published As

Publication number Publication date
EP0417054A1 (de) 1991-03-13
JPH03136139A (ja) 1991-06-10
JPH0623957B2 (ja) 1994-03-30
DE69023196D1 (de) 1995-11-30
EP0417054B1 (de) 1995-10-25

Similar Documents

Publication Publication Date Title
US4989132A (en) Object-oriented, logic, and database programming tool with garbage collection
US5274821A (en) Communication between prolog and an external process
US5274820A (en) Method and system for eliminating operation codes from intermediate prolog instructions
Lamb Construction of a peephole optimizer
DE69023576T2 (de) Verbesserte Adressierung in &#34;Prolog&#34;.
DE69023196T2 (de) Implizite Prologargumente.
DE2249852A1 (de) Computersystem
Zosel A parallel approach to compilation
EP0414651A1 (de) Prolog-Unterbrechungsverarbeitungssystem
Jones et al. TEMPO: A Unified Treatment of Binding Time and Parameter Passing Concepts in Programming Languaues
Bauer et al. Algol W implementation
EP0415895A1 (de) Kommunikation zwischen &#34;PROLOG&#34; und einem externen Prozess
EP0856789A2 (de) Intelligente Rekompilierung von Quellprogrammen
Milikowski et al. The G-line a distributed processor for graph reduction
Arpita Magnifying Data Structures
Haines Serial compilation and the 1401 FORTRAN compiler
Wasilew A compiler writing system with optimization capabilities for complex object order structures
Appleby et al. Garbage Collection for Prolog Based on WAM (Revised version)
Haridi et al. Garbage Collection for Prolog Based on WAM
Noonan Computer programming with a dynamic algebra
Van Tuyl On evolution of Fortran
Tamm et al. A List‐based Virtual Machine for COBOL
Ledbetter A pseudo language processor for design validation and implementation of systems
Marino et al. A new approach to parallel functional programming
Tompsett Semantic and Module Facilities for an Extensible Language System

Legal Events

Date Code Title Description
8364 No opposition during term of opposition
8320 Willingness to grant licences declared (paragraph 23)
8328 Change in the person/name/address of the agent

Representative=s name: DUSCHER, R., DIPL.-PHYS. DR.RER.NAT., PAT.-ANW., 7