O Prolog é realmente baseado na suposição de mundo fechado?
Sob a suposição de mundo fechado ,
o que atualmente não é conhecido como verdade, é falso
A semântica do Prolog é frequentemente considerada como seguindo a suposição de mundo fechado, por exemplo, aqui :
Prolog é baseado na suposição de mundo fechado (CWA) - isto é, se uma proposição não está no banco de dados de fatos e não pode ser derivado do banco de dados de fatos, então não é verdade.
No entanto, ele não se comporta dessa maneira. Sob CWA, eu esperaria
?- a.
false.
Mas em vez disso, no SWI-Prolog, eu obtenho:
?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)
Por que é que? É errado dizer que Prolog é baseado em CWA?
Respostas
Ao falar sobre Closed-World Assumption (CWA) no contexto do Prolog, uma distinção deve ser feita entre predicados desconhecidos e predicados conhecidos para o sistema (tempo de execução). Em ambos os casos, predicados com ou sem cláusulas.
Chamar um predicado desconhecido irá, por padrão, gerar um erro de existência de predicado. Há um sinalizador padrão unknown
, cujo valor padrão é error
, que pode ser definido como fail
. Isso lhe dará o comportamento que você aparentemente está procurando. Ainda assim, eu recomendo fortemente que você mantenha o sinalizador definido com seu valor padrão de error
, uma vez que permite a detecção mais fácil de predicados de programação (por exemplo, erros de digitação em nomes de predicado ou aridade).
O que torna um predicado conhecido no tempo de execução? Diretivas de predicado ou cláusulas de predicado. O exemplo mais familiar é a dynamic/1
diretiva. Se o seu código consistir apenas no seguinte texto:
:- dynamic(foo/1).
Então, depois de compilar e carregar, você pode esperar:
?- foo(_).
no.
Mas outras diretivas têm o mesmo efeito (por exemplo , multifile/1
e discontiguous/1
, assumindo que é uma implementação Prolog em conformidade com o padrão!).
Assim, para predicados conhecidos , a interpretação de CWA em Prolog é simples: o que não podemos provar ser verdade, é falso. Ou seja, negação por fracasso , que não é o mesmo que negação lógica . O nome Prolog vem da programação em lógica, mas Prolog também pretende ser uma linguagem de programação pragmática e prática.
O que está faltando no Prolog (e é fornecido por exemplo, Logtalk ) é ser capaz de declarar um predicado sem ser forçado a declará-lo como dinâmico, ou multifile, ou ... ou exigir o fornecimento de cláusulas para ele (veja, por exemplo, este exemplo ). Isso fornece uma semântica CWA mais simples e clara: chamar um predicado declarado sem cláusulas falha (sem a necessidade de mexer com o unknown
sinalizador problemático ); chamar um predicado não declarado gera um erro de existência de predicado.
Espero que isto ajude. Procurar a negação como falha deve fornecer mais esclarecimentos.
Sua consulta deve estar na própria linguagem, pois a
para ser uma proposição a/0
deve ser na linguagem, ou seja, definida como um predicado. Todos os predicados nulos na linguagem são proposições. Você não pode consultar um novo termo como predicado sem primeiro adicioná-lo ao idioma.
Pois a/1
quando você o define exatamente como a(b).
está na linguagem, a consulta a(X), dif(X,b)
irá falhar, pois o sistema de prólogo não conhece nenhum outro termo que o satisfaça e, assumindo mundo próximo, não há outro.