Erro de afirmação do GNU Prolog
-
21-12-2019 - |
Pergunta
Sou novo no Prolog, mas estou preso a esse comando supostamente simples.Eu carreguei uma base de conhecimento sem erros e sempre que tento fazer afirmar (e até mesmo ajuda) Recebo a seguinte mensagem:
uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
O que exatamente estou perdendo?Estimado.
Solução
Usar assertz/1
ou asserta/1
em vez de.GNU-Prolog não fornece assert/1
porque só asserta/1
e assertz/1
são definidos na norma.
Observe que enquanto asserta/1
sempre teve um significado de interpretação claro adicione a cláusula no início, o significado de assertz/1
foi mais difícil de resolver, pois "adicionar uma cláusula no final" não determina completamente a semântica dos objetivos que foram invocados antes da afirmação da cláusula.
Com o ISO-Prolog, as metas que foram invocadas antes do assertz/1
(mas também retract/1
) permanecem inalterados.Isto é conhecido como visualização de atualização lógica.Para citar a norma (ISO/IEC 13211-1:1995):
7.5.4 Uma atualização lógica do banco de dados
Qualquer alteração no banco de dados que ocorra como resultado de
executar um objetivo (por exemplo, quando o ativador de um
subobjetivo é uma chamada deassertz/1
ouretract/1
) afetará
apenas uma ativação cuja execução começa posteriormente.O
alteração não afetará nenhuma ativação que esteja atualmente
sendo executado.NOTA — Assim o banco de dados fica congelado durante a execução do
um objetivo, e a lista de cláusulas que definem uma predicação é fixada em
o momento da sua execução (ver 7.7.7 e).
Observe que no DECsystem 10 Prolog, o manual fez uma grande diferença entre assert/1
e assertz/1
.Na citação a seguir do guia do usuário do DECsystem 10 de 1978, o termo implementação definida só pode significar o que é conhecido na norma como dependente da implementação (significando essencialmente indefinido).
5.5 Meta-Lógico
...
assert(C)
A instância atual de
C
é interpretado como uma cláusula e é adicionado
para o programa interpretado atual (com novas variáveis privadas
substituindo quaisquer variáveis não instanciadas).A posição do novo
cláusula dentro do procedimento em questão é definida pela implementação.
C
deve ser instanciado para uma não variável.
asserta(C)
Como
assert(C)
, exceto que a nova cláusula se torna a primeira
cláusula relativa ao procedimento em causa.
assertz(C)
Como
assert(C)
, exceto que a nova cláusula se torna a última
cláusula relativa ao procedimento em causa.
Também hoje existem sistemas onde assert/1
e assertz/1
diferem.Por exemplo., xsb.