Łą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
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
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)
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
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ę
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:
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)))
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
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.
InterProlog
InterProlog
Przydatne adresy:
Przydatne adresy:
.
http://www.cs.ucy.ac.cy/compulog/dec98update/projects/interprolo
http://www.cs.ucy.ac.cy/compulog/dec98update/projects/interprolo
g.htm
g.htm
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)
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
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")});
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" ));
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));
}
}
JPL
JPL
Przydatne adresy:
Przydatne adresy:
_
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
Java i Prolog
Java i Prolog
Przydatne adresy:
Przydatne adresy:
.
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
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.
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)
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);
Przydatne adresy:
Przydatne adresy:
http://www.amzi.com/manuals/amzi7/ls/lsprguid.htm
http://www.amzi.com/manuals/amzi7/ls/lsprguid.htm
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
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
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.
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);
Link
Link
http://www.trinc-prolog.com/doc/pl_dll.htm
http://www.trinc-prolog.com/doc/pl_dll.htm