background image

 

 

 

 

Łączenie Prologa z 

Łączenie Prologa z 

innymi językami 

innymi językami 

programowania

programowania

Sławomir Bazan

Sławomir Bazan

Marek Grabowski

Marek Grabowski

Adam Libura

Adam Libura

AiR – EAIiE

AiR – EAIiE

2004/2005

2004/2005

background image

 

 

 

 

Java i Prolog

Java i Prolog

Java

Java

język wieloplatformowy, przenośny

język wieloplatformowy, przenośny

w całości zorientowany obiektowo

w całości zorientowany obiektowo

stworzony dla potrzeb aplikacji internetowych

stworzony dla potrzeb aplikacji internetowych

Prolog

Prolog

używany do tworzenia inteligentnych 

używany do tworzenia inteligentnych 

komponentów, w których wiedza wyrażana jest w 

komponentów, w których wiedza wyrażana jest w 

kategoriach logiki, czyli zbliżonych do ludzkiego 

kategoriach logiki, czyli zbliżonych do ludzkiego 

rozumowania

rozumowania

background image

 

 

 

 

Java i Prolog

Java i Prolog

Połączenie Prologa z Javą pozwala na wykorzystanie najmocniejszych 

Połączenie Prologa z Javą pozwala na wykorzystanie najmocniejszych 

stron obu języków. Umożliwia tworzenie rozbudowanych systemów 

stron obu języków. Umożliwia tworzenie rozbudowanych systemów 

doradczych z interfejsem graficznym, w znaczący sposób 

doradczych z interfejsem graficznym, w znaczący sposób 

ułatwiając obsługę takich systemów, a także wykorzystanie 

ułatwiając obsługę takich systemów, a także wykorzystanie 

możliwości Internetu.

możliwości Internetu.

Możliwości

Możliwości

tworzenie aplikacji w Javie z fragmentami kodu w Prologu, polega 

tworzenie aplikacji w Javie z fragmentami kodu w Prologu, polega 

to na zastosowaniu odpowiedniej biblioteki i połączeniu 

to na zastosowaniu odpowiedniej biblioteki i połączeniu 

poszczególnych części programu w czasie kompilacji

poszczególnych części programu w czasie kompilacji

wykorzystanie dynamicznie dołączonej biblioteki dll 

wykorzystanie dynamicznie dołączonej biblioteki dll 

często używane rozwiązanie polegające na zastosowaniu serwera, 

często używane rozwiązanie polegające na zastosowaniu serwera, 

dostarczającego usług związanych z programem w Prologu 

dostarczającego usług związanych z programem w Prologu 

(przykładem jest Amzi Prolog Logic Server) 

(przykładem jest Amzi Prolog Logic Server) 

background image

 

 

 

 

InterProlog

InterProlog

Dostępny dla systemów

Dostępny dla systemów

Windows

Windows

Linux

Linux

Mac OS X

Mac OS X

Wspiera

Wspiera

SWI Prolog

SWI Prolog

XSB Prolog

XSB Prolog

Dystrybuowany na licencji GNU

Dystrybuowany na licencji GNU

Możliwości

Możliwości

wywołanie dowolnego celu Prologa poprzez obiekt 

wywołanie dowolnego celu Prologa poprzez obiekt 

PrologEngine

PrologEngine

 

 

wywołanie dowolnej metody przy użyciu predykatu 

wywołanie dowolnej metody przy użyciu predykatu 

javaMessage

javaMessage

wzajemna rekurencja

wzajemna rekurencja

wspiera wielowątkowość Javy

wspiera wielowątkowość Javy

background image

 

 

 

 

InterProlog

InterProlog

Programowanie od strony Prologa

Programowanie od strony Prologa

Dostarczone predykaty pozwalają wywołać dowolną metodę lub 

Dostarczone predykaty pozwalają wywołać dowolną metodę lub 

konstruktor Java. Najważniejsze z nich to:

konstruktor Java. Najważniejsze z nich to:

ipPrologEngine(E)

ipPrologEngine(E)

 - zwraca referencję do obiektu 

 - zwraca referencję do obiektu 

PrologEngine

PrologEngine

, który 

, który 

uruchomił ten proces Prologa

uruchomił ten proces Prologa

javaMessage(Target, Result, Exception, Message, ArgList, 

javaMessage(Target, Result, Exception, Message, ArgList, 

NewArgList)

NewArgList)

 - synchronicznie wysyła wiadomość Message do obiektu 

 - synchronicznie wysyła wiadomość Message do obiektu 

Target, czekając na rezultat Result, przechwytując ewentualne wyjątki 

Target, czekając na rezultat Result, przechwytując ewentualne wyjątki 

Exception. Przesyłane są argumenty ArgList, do NewArgList 

Exception. Przesyłane są argumenty ArgList, do NewArgList 

zapisywane są ewentualnie zmienione argumenty

zapisywane są ewentualnie zmienione argumenty

javaMessage(Target, Result, Message)

javaMessage(Target, Result, Message)

 - działa tak samo jak pełna 

 - działa tak samo jak pełna 

instrukcja, z tym, że wiadomość ma format nazwaMetody(argumenty), 

instrukcja, z tym, że wiadomość ma format nazwaMetody(argumenty), 

jeżeli nastąpi jakiś wyjątek to przesłany on zostanie do wyjściowego 

jeżeli nastąpi jakiś wyjątek to przesłany on zostanie do wyjściowego 

strumienia Prologa, natomiast metoda nie wykona się

strumienia Prologa, natomiast metoda nie wykona się

background image

 

 

 

 

InterProlog

InterProlog

Przykład użycia predykatu

Przykład użycia predykatu

javaMessage('javax.swing.JFrame',W,'JFrame'(string(myTitle))), 

javaMessage('javax.swing.JFrame',W,'JFrame'(string(myTitle))), 

javaMessage(W,C,getContentPane), 

javaMessage(W,C,getContentPane), 

javaMessage('javax.swing.JLabel',L,

javaMessage('javax.swing.JLabel',L,

           

           

'JLabel'(string('Hello Prolog, greetings from Swing:-)'))),

'JLabel'(string('Hello Prolog, greetings from Swing:-)'))),

javaMessage(C,add(string('Center'),L)),

javaMessage(C,add(string('Center'),L)),

javaMessage(W,pack),javaMessage(W,show).

javaMessage(W,pack),javaMessage(W,show).

Powyższy kod spowoduje pojawienie się okna:

Powyższy kod spowoduje pojawienie się okna:

background image

 

 

 

 

InterProlog

InterProlog

Wizualizacja danych Prologa

Wizualizacja danych Prologa

browseTerm(Term)

browseTerm(Term)

 - predykat powoduje utworzenie okna 

 - predykat powoduje utworzenie okna 

pozwalającego przeglądać Term

pozwalającego przeglądać Term

Przykład użycia

Przykład użycia

browseTerm(callAnotherProlog(SWI, findall(op(P,T,Name), 

browseTerm(callAnotherProlog(SWI, findall(op(P,T,Name), 

current_op(P,T,Name), SWIops)))

current_op(P,T,Name), SWIops)))

background image

 

 

 

 

InterProlog

InterProlog

Programowanie od strony Javy

Programowanie od strony Javy

InterProlog składa się z czterech pakietów

InterProlog składa się z czterech pakietów

com.declarativa.interprolog

com.declarativa.interprolog

podstawowy pakiet

podstawowy pakiet

com.declarativa.interprolog.gui

com.declarativa.interprolog.gui

wizualizacja

wizualizacja

com.declarativa.interprolog.util

com.declarativa.interprolog.util

dodatowe narzędzia

dodatowe narzędzia

com.xsb.interprolog

com.xsb.interprolog

dla XSB Prolog

dla XSB Prolog

Najważniejszą klasą jest 

Najważniejszą klasą jest 

PrologEngine

PrologEngine

 z pakietu 

 z pakietu 

com.declarativa.interprolog

com.declarativa.interprolog

background image

 

 

 

 

InterProlog

InterProlog

Klasa 

Klasa 

PrologEngine

PrologEngine

 zawiera szereg metod, z których najważniejsza:

 zawiera szereg metod, z których najważniejsza:

public Object[] deterministicGoal (String G, String OVar, Object[] 

public Object[] deterministicGoal (String G, String OVar, Object[] 

objectsP, String RVars)

objectsP, String RVars)

 - wysyła synchronicznie zapytanie do Prologa, 

 - wysyła synchronicznie zapytanie do Prologa, 

tylko pierwsze rozwiązanie jest rozważane

tylko pierwsze rozwiązanie jest rozważane

Parametry:

Parametry:

G - term celu Prologa

G - term celu Prologa

OVar

OVar

- zmienna Prologa, która będzie przypisana do tablicy obiektów 

- zmienna Prologa, która będzie przypisana do tablicy obiektów 

objectsP

objectsP

objectsP - tablica obiektów w Javie, która ma być przekazana do Prologa

objectsP - tablica obiektów w Javie, która ma być przekazana do Prologa

RVars - lista Prologa ze specyfikacją obiektów, zwykle zawiera zmienne 

RVars - lista Prologa ze specyfikacją obiektów, zwykle zawiera zmienne 

występujące w G

występujące w G

Zwraca:

Zwraca:

nową tablicę, zawierającą obiekt dla każdego termu z listy RVars lub NULL 

nową tablicę, zawierającą obiekt dla każdego termu z listy RVars lub NULL 

jeśli wywołanie się nie powiedzie

jeśli wywołanie się nie powiedzie

Instrukcja posiada też kilka uproszczonych wersji, w których nie występuja 

Instrukcja posiada też kilka uproszczonych wersji, w których nie występuja 

wszystkie powyższe parametry.

wszystkie powyższe parametry.

background image

 

 

 

 

InterProlog

InterProlog

Przydatne adresy:

Przydatne adresy:

http://

http://

www

www

.

.

declarativa

declarativa

.

.

com

com

/

/

InterProlog

InterProlog

 /

 /

http://www.cs.ucy.ac.cy/compulog/dec98update/projects/interprolo

http://www.cs.ucy.ac.cy/compulog/dec98update/projects/interprolo

g.htm

g.htm

background image

 

 

 

 

JPL

JPL

JPL - dwukierunkowy interfejs Java/Prolog

JPL - dwukierunkowy interfejs Java/Prolog

Własności

Własności

działa w oparciu o SWI Prolog oraz interfejs jni dla Javy

działa w oparciu o SWI Prolog oraz interfejs jni dla Javy

pozwala dodawać kod Prologa do programu w Javie

pozwala dodawać kod Prologa do programu w Javie

pozwala dodawać kod Javy do programu w Prologu

pozwala dodawać kod Javy do programu w Prologu

wykorzystuje dynamiczną bibliotekę dll

wykorzystuje dynamiczną bibliotekę dll

projekt dystrybuowany na licencji GNU

projekt dystrybuowany na licencji GNU

Możliwości

Możliwości

korzystanie ze wszystkich klas i metod Javy

korzystanie ze wszystkich klas i metod Javy

użycie wszystkich standardowych bibliotek i predykatów Prologa

użycie wszystkich standardowych bibliotek i predykatów Prologa

tworzenie hybrydowych aplikacji (Java+Prolog)

tworzenie hybrydowych aplikacji (Java+Prolog)

background image

 

 

 

 

JPL

JPL

Programowanie od strony Prologa

Programowanie od strony Prologa

jpl_new(Class, Params, Ref)

jpl_new(Class, Params, Ref)

 -tworzenie instancji klasy Class Javy z 

 -tworzenie instancji klasy Class Javy z 

parametrami Javy, zwracana jest referencja Ref

parametrami Javy, zwracana jest referencja Ref

jpl_call(Ref, Method, Params, Result)

jpl_call(Ref, Method, Params, Result)

 - wywołanie metody 

 - wywołanie metody 

należącej do wcześniej utworzonej instancji klasy

należącej do wcześniej utworzonej instancji klasy

background image

 

 

 

 

JPL

JPL

Programowanie od strony Javy

Programowanie od strony Javy

Przykład użycia, kod w Prologu, zapisany w pliku test.pl

Przykład użycia, kod w Prologu, zapisany w pliku test.pl

child_of(joe, ralf). 

child_of(joe, ralf). 

child_of(mary, joe). 

child_of(mary, joe). 

child_of(steve, joe). 

child_of(steve, joe). 

descendent_of(X, Y) :- child_of(X, Y). 

descendent_of(X, Y) :- child_of(X, Y). 

descendent_of(X, Y) :- child_of(Z, Y), descendent_of(X, Z).

descendent_of(X, Y) :- child_of(Z, Y), descendent_of(X, Z).

Kod w Javie

Kod w Javie

Query q1 = new Query("consult",

Query q1 = new Query("consult",

 

 

new Term[] {new Atom("test.pl")});

new Term[] {new Atom("test.pl")});

background image

 

 

 

 

JPL

JPL

Sprawdzenie powodzenia akcji za pomocą metody 

Sprawdzenie powodzenia akcji za pomocą metody 

query

query

System.out.println( "consult " + (q1.query() ? 

System.out.println( "consult " + (q1.query() ? 

"succeeded" : "failed"));

"succeeded" : "failed"));

Przesłanie zapytania do bazy danych:

Przesłanie zapytania do bazy danych:

Query q2 = new Query(

Query q2 = new Query(

"child_of", new Term[] {new Atom("joe"),new Atom("ralf")}); 

"child_of", new Term[] {new Atom("joe"),new Atom("ralf")}); 

System.out.println("child_of(joe,ralf) is " +

System.out.println("child_of(joe,ralf) is " +

 

 

( q2.query() ? "provable" : "not provable" ));

( q2.query() ? "provable" : "not provable" ));

background image

 

 

 

 

JPL

JPL

Zapytanie z użyciem zmiennych

Zapytanie z użyciem zmiennych

Variable X = new Variable(); 

Variable X = new Variable(); 

Query q4 = new Query( 

Query q4 = new Query( 

        "descendent_of", new Term[] {X,new Atom("ralf")}); 

        "descendent_of", new Term[] {X,new Atom("ralf")}); 

java.util.Hashtable solution; 

java.util.Hashtable solution; 

solution = q4.oneSolution(); 

solution = q4.oneSolution(); 

System.out.println( 

System.out.println( 

"first solution of descendent_of(X, ralf)"); 

"first solution of descendent_of(X, ralf)"); 

System.out.println( "X = " + solution.get(X));

System.out.println( "X = " + solution.get(X));

Znalezienie wszystkich rozwiązań

Znalezienie wszystkich rozwiązań

java.util.Hashtable[] solutions = q4.allSolutions(); 

java.util.Hashtable[] solutions = q4.allSolutions(); 

for ( int i=0 ; i<solutions.length ; i++ ) { 

for ( int i=0 ; i<solutions.length ; i++ ) { 

    System.out.println( "X = " + solutions[i].get(X)); 

    System.out.println( "X = " + solutions[i].get(X)); 

}

}

background image

 

 

 

 

JPL

JPL

Przydatne adresy:

Przydatne adresy:

http://

http://

www

www

.

.

swi

swi

-prolog.

-prolog.

org

org

/

/

packages

packages

/

/

jpl

jpl

/

/

java

java

_

_

api

api

/

/

index

index

.

.

html

html

 

 

background image

 

 

 

 

Java i Prolog

Java i Prolog

Inne interfejsy

Inne interfejsy

Amzi

Amzi

B-Prolog

B-Prolog

BinProlog

BinProlog

BirdLand

BirdLand

CiaoProlog

CiaoProlog

DGKS Prolog

DGKS Prolog

Jasper

Jasper

JavaLog

JavaLog

Translatory Prologa do Javy

Translatory Prologa do Javy

LLPj

LLPj

Prolog Cafe

Prolog Cafe

JIPL

JIPL

JIProlog

JIProlog

jProlog

jProlog

Kiev

Kiev

MINERVA

MINERVA

Prolog IV

Prolog IV

Trinc-Prolog

Trinc-Prolog

yajxb

yajxb

Interpretery

Interpretery

JINNI

JINNI

LL

LL

W-Prolog

W-Prolog

background image

 

 

 

 

Java i Prolog

Java i Prolog

Przydatne adresy:

Przydatne adresy:

http://

http://

www

www

.

.

declarativa

declarativa

.

.

com

com

/

/

interprolog

interprolog

/

/

systems

systems

.

.

htm

htm

background image

 

 

 

 

Amzi Prolog Logic Server LSAPI

Amzi Prolog Logic Server LSAPI

Środowisko Amzi Prolog Logic Server dostarcza usługi związane z 

Środowisko Amzi Prolog Logic Server dostarcza usługi związane z 

korzystaniem z plików napisanych w Prologu w oparciu o 

korzystaniem z plików napisanych w Prologu w oparciu o 

mechanizm klient-serwer. Program uruchamia serwer Prologa, a 

mechanizm klient-serwer. Program uruchamia serwer Prologa, a 

następnie zadaje mu zapytania. LSAPI umożliwia budować termy, 

następnie zadaje mu zapytania. LSAPI umożliwia budować termy, 

konwertować stringi do/z termów, przekazywać termy z/do 

konwertować stringi do/z termów, przekazywać termy z/do 

Prologa.

Prologa.

Biblioteka LSAPI znajduje się w pliku ‘logicServer.h’

Biblioteka LSAPI znajduje się w pliku ‘logicServer.h’

Połączenie z serwerem w C++ zapewnia klasa LogicServer, w 

Połączenie z serwerem w C++ zapewnia klasa LogicServer, w 

przypadku C jest to zestaw funkcji (nazwy zaczynają się od ls)

przypadku C jest to zestaw funkcji (nazwy zaczynają się od ls)

Najprostszy program w C++ będący jedynie hostem dla programu 

Najprostszy program w C++ będący jedynie hostem dla programu 

Prologa wywołuje następujące funkcje klasy:

Prologa wywołuje następujące funkcje klasy:

Init

Init

() – ładuje do pamięci silnik serwera

() – ładuje do pamięci silnik serwera

Load

Load

(logic_base_name) – wczytuje skompilowany program Prologa 

(logic_base_name) – wczytuje skompilowany program Prologa 

(logic_base_name.xpl)

(logic_base_name.xpl)

Main

Main

() – uruchamia główny predykat ‘main’ programu

() – uruchamia główny predykat ‘main’ programu

Close

Close

() – usuwa z pamięci silnik serwera

() – usuwa z pamięci silnik serwera

background image

 

 

 

 

Amzi Prolog Logic Server LSAPI

Amzi Prolog Logic Server LSAPI

Najprostsza metoda zadawania pytań do Prologa i odczytywania 

Najprostsza metoda zadawania pytań do Prologa i odczytywania 

odpowiedzi odbywa się za pomocą stringów poprzez funkcje:

odpowiedzi odbywa się za pomocą stringów poprzez funkcje:

term 

term 

CallStr

CallStr

(query_string) – konwertuje query_string do postaci termu i go 

(query_string) – konwertuje query_string do postaci termu i go 

wywołuje, jeśli zapytanie poprawne zwraca term, w p.p. 0

wywołuje, jeśli zapytanie poprawne zwraca term, w p.p. 0

term 

term 

ExecStr

ExecStr

(query_string) – to samo, ale bez obsługi nawrotów

(query_string) – to samo, ale bez obsługi nawrotów

string

string

 TermToStr

 TermToStr

(term) – konwertuje do stringu otrzymaną odpowiedź na 

(term) – konwertuje do stringu otrzymaną odpowiedź na 

podany term

podany term

tf

tf

 Redo

 Redo

() – wykonuje nawrót w celu pobrania kolejnych rozwiązań, gdy 

() – wykonuje nawrót w celu pobrania kolejnych rozwiązań, gdy 

istnieje zwraca true, w p.p. false

istnieje zwraca true, w p.p. false

Przykład:

Przykład:

Plik Prologu: XGENE.PRO

Plik Prologu: XGENE.PRO

mother(elaine,mary).

mother(elaine,mary).

mother(elaine,kathy).

mother(elaine,kathy).

mother(elaine,ricky).

mother(elaine,ricky).

mother(elaine,jenny).

mother(elaine,jenny).

sibling(X,Y) :- mother(P,X), mother(P,Y), X<>Y.

sibling(X,Y) :- mother(P,X), mother(P,Y), X<>Y.

background image

 

 

 

 

Amzi Prolog Logic Server LSAPI

Amzi Prolog Logic Server LSAPI

Fragment kodu w C++:

Fragment kodu w C++:

TF tf;

TF tf;

TERM t;

TERM t;

char s[80];

char s[80];

...

...

ls.Init();

ls.Init();

ls.Load("xgene");

ls.Load("xgene");

t = ls.CallStr("sibling(mary, X)");

t = ls.CallStr("sibling(mary, X)");

if (t == FALSE) tf = FALSE;

if (t == FALSE) tf = FALSE;

else tf = TRUE;

else tf = TRUE;

while (tf == TRUE) {

while (tf == TRUE) {

printf("%s\n", ls.TermToStr(t));

printf("%s\n", ls.TermToStr(t));

tf = ls.Redo();

tf = ls.Redo();

}

}

ls.Close();

ls.Close();

...

...

Wynik działania programu:

Wynik działania programu:

sibling(mary, kathy)

sibling(mary, kathy)

sibling(mary, ricky)

sibling(mary, ricky)

sibling(mary, jenny)

sibling(mary, jenny)

background image

 

 

 

 

Amzi Prolog Logic Server LSAPI

Amzi Prolog Logic Server LSAPI

Wywoływanie funkcji języka obcego z Prologa

Wywoływanie funkcji języka obcego z Prologa

Warunki dla tworzonych funkcji:

Warunki dla tworzonych funkcji:

Musi zwracać true lub false

Musi zwracać true lub false

Zawodzi przy nawrocie

Zawodzi przy nawrocie

Argumenty predykatów przekazywane są poprzez zestaw funkcji 

Argumenty predykatów przekazywane są poprzez zestaw funkcji 

bibliotecznych LSAPI

bibliotecznych LSAPI

W celu zarejestrowania funkcji  jako predykat używa się polecenia:

W celu zarejestrowania funkcji  jako predykat używa się polecenia:

lsAddPred(char *name

, ARITY arg, VOIDptr ptr);

, ARITY arg, VOIDptr ptr);

gdzie:

gdzie:

name – nazwa rejestrowanego

name – nazwa rejestrowanego

predykatu

predykatu

arg - liczba argumentów

arg - liczba argumentów

rejestrowanej funkcji

rejestrowanej funkcji

ptr – wskaźnik do

ptr – wskaźnik do

rejestrowanej funkcji

rejestrowanej funkcji

Przykład:

Przykład:

TF p_writeln(void)
{
    int val;
    lsGetParm(1, pINT, &val);
    printf("%d", val);
    return TRUE;
}
lsAddPred("writeln", 1, p_writeln);

background image

 

 

 

 

Przydatne adresy:

Przydatne adresy:

http://www.amzi.com/manuals/amzi7/ls/lsprguid.htm

http://www.amzi.com/manuals/amzi7/ls/lsprguid.htm

background image

 

 

 

 

Trinc-Prolog DLL

Trinc-Prolog DLL

Środowisko Trinc-Prolog pozwala na łączenie 

Środowisko Trinc-Prolog pozwala na łączenie 

Prologa z innymi językami programowania 

Prologa z innymi językami programowania 

za pomocą biblioteki tp_32.dll.

za pomocą biblioteki tp_32.dll.

Możliwe połączenia Trinc-Prologa:

Możliwe połączenia Trinc-Prologa:

> C

> C

> Delphi

> Delphi

> C++

> C++

> Visual Basic

> Visual Basic

> Borland C++ Builder

> Borland C++ Builder

> Java

> Java

background image

 

 

 

 

Trinc-Prolog DLL

Trinc-Prolog DLL

Dla

Dla

 ś

 ś

rodowiska Borland C++ Builder jest 

rodowiska Borland C++ Builder jest 

przeznaczona specjalna klasa 

przeznaczona specjalna klasa 

TprologEngine

TprologEngine

która zapewnia 

która zapewnia 

ł

ł

atw

atw

ą

ą

 obs

 obs

ł

ł

ug

ug

ę

ę

 tp_32.dll. Deklaracja 

 tp_32.dll. Deklaracja 

tej klasy zawarta jest w pliku 

tej klasy zawarta jest w pliku 

tcomp.h.

tcomp.h.

 

 

Funkcje klasy

Funkcje klasy

:

:

TPrologEngine( TComponent* Owner ) – konstruktor klasy

TPrologEngine( TComponent* Owner ) – konstruktor klasy

virtual ~TPrologEngine( void )

virtual ~TPrologEngine( void )

 – destruktor 

 – destruktor 

static int Version( void )

static int Version( void )

 – wersja interfejsu

 – wersja interfejsu

int Prove( char *Goal )

int Prove( char *Goal )

 – wykonanie predykatu

 – wykonanie predykatu

int Continue( void )

int Continue( void )

 – znajduje kolejne

 – znajduje kolejne

 

 

rozw

rozw

.

.

int NumVars( void )

int NumVars( void )

 – liczba zm

 – liczba zm

.

.

 

 

o

o

st

st

.

.

 zapytania

 zapytania

const char *VarName( int Index ) 

const char *VarName( int Index ) 

 – nazwa zmiennej

 – nazwa zmiennej

const char *VarValue( int Index ) 

const char *VarValue( int Index ) 

 – warto

 – warto

ść

ść

 zmiennej

 zmiennej

int VarType( int Index )

int VarType( int Index )

 – typ zmiennej

 – typ zmiennej

background image

 

 

 

 

Trinc-Prolog DLL

Trinc-Prolog DLL

Przykład:

Przykład:

suma(1,1).

suma(1,1).

suma(N,X) :-

suma(N,X) :-

N > 1,

N > 1,

N1 is N – 1,

N1 is N – 1,

suma(N1,X1),

suma(N1,X1),

X is X1 + N.

X is X1 + N.

background image

 

 

 

 

Trinc-Prolog DLL

Trinc-Prolog DLL

Fragment kodu Borland Builder C++:

Fragment kodu Borland Builder C++:

TPrologEngine *_Engine1;

TPrologEngine *_Engine1;

_Engine1 = new TPrologEngine(this);

_Engine1 = new TPrologEngine(this);

 

 

int result = _Engine1->Prove(“suma(5,N).”);

int result = _Engine1->Prove(“suma(5,N).”);

int NumVar = _Engine1->NumVars();

int NumVar = _Engine1->NumVars();

 

 

if ( result == TP_SOLUTION ) {

if ( result == TP_SOLUTION ) {

for( int i=0; i<NumVar; i++ ) {

for( int i=0; i<NumVar; i++ ) {

            

            

Str  = AnsiString( Engine->VarName(i) );

Str  = AnsiString( Engine->VarName(i) );

            

            

Str += AnsiString(" = ");

Str += AnsiString(" = ");

                        

                        

Str += AnsiString( Engine->VarValue(i));

Str += AnsiString( Engine->VarValue(i));

            

            

Str += AnsiString(", ");

Str += AnsiString(", ");

            

            

Text += Str;   

Text += Str;   

}

}

    

    

}

}

Application->MessageBox(Text.c_str(), “Wynik”, MB_OK);

Application->MessageBox(Text.c_str(), “Wynik”, MB_OK);

 

 

background image

 

 

 

 

Link

Link

http://www.trinc-prolog.com/doc/pl_dll.htm

http://www.trinc-prolog.com/doc/pl_dll.htm


Document Outline