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.

Foi útil?

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 de assertz/1 ou retract/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., .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top