Jump to content
Sign in to follow this  
zecapistolas

SICStus Prolog -> Gnu Prolog

Recommended Posts

zecapistolas

Boas,  ;)

Tenho código em Prolog, nomeadamente para comunicação através de Sockets, que eu utilizava em Windows porque tinha uma licença do SICStus Prolog para essa plataforma....

Agora que migrei para Linux, não tenho SICStus Prolog, mas tenho Gnu Prolog....  :cheesygrin:

O problema é que estou a ter algumas incompatibilidades....

O ficheiro de teste é o seguinte:

:-use_module(library(sockets)).

port(60001).

force_close:-
        socket_bk(S), socket_close(S).

socket_bk(0).

server:-
        current_host(Host),
        port(Port),
        socket('AF_INET', Socket),
        socket_bind(Socket, 'AF_INET'(Host,Port)),
        socket_listen(Socket, 5),
        socket_accept(Socket, _Client, Stream),
        abolish(socket_bk/1),asserta(socket_bk(Socket)),
        server_loop(Stream),
        socket_close(Socket),
        write('Server Exit'),nl.

server_loop(Stream) :-
        repeat,
                read(Stream, ClientRequest),
                write('Received: '), write(ClientRequest), nl, 
                server_input(ClientRequest, ServerReply),
                format(Stream, '~q.~n', [serverReply]),
                write('Send: '), write(ServerReply), nl, 
                flush_output(Stream),
        (ClientRequest == bye; ClientRequest == end_of_file), !.

% server_input(+Mensagem, -Resposta)
server_input(initialize, R):-
    R is 29, !.

server_input(bye, ok):-!.
server_input(end_of_file, ok):-!.
server_input(_, invalid) :- !.

Ao consultar, aparece este warning:

:1: warning: unknown directive use_module/1 - maybe use initialization/1 - directive ignored

Tudo bem que não passa de um warning, mas depois quando faço "server." para inicializar o Servidor aparece:

uncaught exception: error(existence_error(procedure,current_host/1),server/0)

Alguma dica?!  🤔

cumps  :P

Share this post


Link to post
Share on other sites
takecare

o predicado current_host/1 não funciona pq não me parece ser compatível com a versão do prolog que estás a usar (gnu prolog), isso é compreensível uma vez que nem o use_module é reconhecido. eu não conheço o gnu prolog, mas dei uma olhadela no manual e, talvez, se leres isto possas encontrar uma ajuda: http://www.gprolog.org/manual/gprolog.html#htoc273 :)


takecare@feup::mieic

Share this post


Link to post
Share on other sites
zecapistolas

Boas,

Já fiz algumas alterações:

port(60001).
host('127.0.0.1').

server:-
port(Port),
host(Host),
socket('AF_INET', Socket),
socket_bind(Socket, 'AF_INET'(Host, Port)),
socket_listen(Socket, 5),
socket_accept(Socket, StreamIn, StreamOut),
server_loop(StreamIn, StreamOut),
socket_close(Socket),
write('Server Exit'), nl.

server_loop(StreamIn, StreamOut):-
repeat,
	write('Repeat'), nl,
	read(StreamIn, ClientRequest),
	write('Received: '), write(ClientRequest), nl,
	server_input(ClientRequest, ServerReply),
	format(StreamOut, '~q.~n', [serverReply]),
	write('Send: '), write(ServerReply), nl,
	flush_output(StreamOut),
(ClientRequest == bye; ClientRequest == end_of_file), !.

% server_input(+Mensagem, -Resposta)
server_input(initialize, R):-
R is 29, !.

server_input(bye, ok):- !.
server_input(end_of_file, ok):- !.
server_input(_, invalid):- !.

Já recebo bem no Prolog, mas quando envio para o C++ não consigo receber nada, ou StreamOut não está a enviar, ou o "canal" está mal....

cumps  :(

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.