4.3 Definic¸˜ao dos predicados de interface
4.3.4 Predicados de gest˜ao dos executores de Prolog
Este conjunto de predicados permite gerir dinamicamente os executores que constituem o ambiente de execuc¸˜ao paralela, criando ou destruindo instˆancias de executores de Prolog nos v´arios n´os de um multicomputador.
Qualquer executor de Prolog pode criar uma nova instˆancia de um executor de Prolog, no mesmo ou em outro n´o. Estes dois executores de Prolog s˜ao dois processos totalmentes independentes entre si, n˜ao partilhando quaisquer relac¸ ˜oes l´ogicas, e.g. relac¸˜ao pai/filho, nem espac¸os de enderec¸amento.
sys create wam(+Node,+Flags,+In dev,+Out dev,+Cmd line,;Eid,;Status )
Cria uma instˆancia de um executor de Prolog (WAM11) no n´o Node devolvendo um identificador
´unico da mesma emEid. Se n˜ao for poss´ıvel criar o novo processo no n´o especificado,e.g. Node n˜ao designa um n´o v´alido do sistema, retorna um c´odigo de erro emStatus.
Na vers˜ao actual o argumentoFlags apenas admite como valor o ´atomo p noflag.
Os argumentos In dev e Out dev indicam, de forma independente entre si, quais s˜ao os dispositivos de entrada e de sa´ıda do novo executor de Prolog a criar, podendo indicar um dis- positivo de entrada/sa´ıda do ambiente de operac¸ ˜ao do computador ou ent˜ao uma porta do sis- tema. Para indicar um dispositivo f´ısico do computador o argumento dever´a ser uma estrutura
10
Admitindo que a granularidade do rel´ogio ´e dependente do sistema, o tempo especificado ser´a aproximado tanto quanto poss´ıvel.
11
4.3 Definic¸˜ao dos predicados de interface 43
com a forma dev(+System device), onde System device identifica o dispositivo de en-
trada/sa´ıda; para indicar uma porta do sistema o argumento dever´a ser uma estrutura com a forma port(+Port name), onde Port name indica o nome da porta.
Se se indicar uma porta como dispositivo de entrada, ela ser´a criada autom´aticamente durante a fase de inicializac¸ ˜ao do executor de Prolog (pelo que n˜ao dever´a j´a existir outra porta com o mesmo nome). No caso de se indicar uma porta como dispositivo de sa´ıda do novo executor de Prolog, assume-se que ela foi (ou ser´a) criada por um outro executor, pelo que o novo executor a vai tentar abrir com sys open port/4, esperando que ela seja criada caso n˜ao exista ainda.
O argumento Cmd line ´e um ´atomo com argumentos de linha de comando para o executor a criar, caso este os aceite.
Na figura 4.1 ´e apresentado o ciclo principal de um executor de Prolog. Salienta-se a sua genera- lidade pelo facto de os canais standard de entrada e sa´ıda (stdin e stdout) tanto poderem corresponder a ficheiros (o que inclui o acesso `a consola) como a portas do sistema.
:- repeat,
read( Goal ), % Recebe do cliente um golo "Goal"
% para resolver, pelo <stdin>, que
% pode ser um terminal ou uma porta
try( Goal, Solution ), % Procura uma soluc¸˜ao para o golo
write( Solution ), % Envia a soluc¸˜ao para o cliente, pelo
% <stdout>, que pode ser um terminal
% ou uma porta
fail. % Procura todas as soluc¸˜oes por
% retrocesso e depois espera por novos % pedidos
Figura 4.1: Ciclo principal de um “executor de Prolog” Este predicado pode retornar emStatus um dos seguintes c´odigos de erro:
EOPTION – Um dos argumentos Flags, In dev ou Out dev cont´em um valor inv´alido ou n˜ao admitido neste predicado;
EBADNODE – O argumento Node indica um n´o inv´alido no sistema.
Exemplo: “sys create wam(5, p noflag, dev(’/dev/tty3’), port(foo bar), ’-q’, P, S)” Cria
uma instˆancia do executor (WAM) no n´o5. Este executor receber´a o argumento de linha de comando ’-q’, e utilizar´a como canal principal de entrada o dispositivo/dev/tty3 e como canal principal de sa´ıda a portafoo bar. Devolve em P o identificador ´unico associado ao novo executor e emS o resultado da operac¸˜ao (sucesso ou n˜ao).
sys destroy wam(+Eid,;Status )
Destr´oi o executor de Prolog identificado por Eid. O processamento que este esteja a fazer ´e in- terrompido, mas os efeitos de todas as suas acc¸ ˜oes que interagiram com o exterior, e.g. mensagens enviadas para outros executores, n˜ao s˜ao cancelados.
Todas as mensagens e sinais pendentes ainda n˜ao tratados por esse executor ser˜ao ignorados. Qualquer executor de Prolog pode destruir outro, desde que tenha o seu identificadorEid.
EOPTION – O argumento Eid, cont´em um valor inv´alido ou n˜ao admitido neste predicado, i.e. n˜ao ´e um identificador de executor v´alido.
Exemplo: “sys destroy wam(34563, S)” Destr´oi o executor de Prolog com o identifica-
dor34563, devolvendo em S o resultado da operac¸˜ao (sucesso ou n˜ao).
sys at halt(+Goal,;Status )
Insere o termo Goal numa lista de predicados a serem executados quando o executor invocador terminar (ou for destru´ıdo). Goal dever´a indicar um predicado com 0 (zero) argumentos, i.e. dever´a ter aridade 0 (zero). Devolve emStatus o resultado da operac¸˜ao (sucesso ou n˜ao)12.
Os predicados s˜ao executados pela ordem inversa da ordem pela qual foram inseridos na lista (a lista tem uma organizac¸ ˜ao em pilha).
Este predicado pode retornar emStatus um dos seguintes c´odigos de erro: EINVAL – O termo especificado em Goal n˜ao tem aridade 0 (zero).
Exemplo: “sys at halt(foo at halt, S)” Insere o predicadofoo at halt/0 na lista (pilha) de predicados a serem executados quando o executor terminar, devolvendo emS o resultado da operac¸˜ao.
frac sleep(+Time )
Suspende o executor de Prolog durante o n´umero de segundos indicados emTime. Time poder´a ser um n´umero inteiro ou um n´umero decimal13.
A chegada de um sinal pode interromper a execuc¸˜ao deste predicado, que ser´a continuada quando o processamento do sinal terminar.
Exemplo: “frac sleep(1.3)” Suspende o executor invocador durante 1.3 segundos, aproxima-
damente.