• Nenhum resultado encontrado

Predicados de gest˜ao dos executores de Prolog

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.