Prolog est-il vraiment basé sur l'hypothèse du monde fermé?

Nov 25 2020

Sous l' hypothèse du monde fermé ,

ce qui n'est pas actuellement connu pour être vrai est faux

On dit souvent que la sémantique de Prolog suit l'hypothèse du monde fermé, par exemple ici :

Prolog est basé sur l'hypothèse d'un monde fermé (CWA) - c'est-à-dire que si une proposition n'est pas dans la base de données de faits et ne peut pas être dérivée de la base de données de faits, alors ce n'est pas vrai.

Cependant, il ne se comporte pas tout à fait de cette façon. Sous CWA, je m'attendrais

?- a.
false.

Mais à la place, dans SWI-Prolog, j'obtiens:

?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)

Pourquoi donc? Est-il faux de dire que Prolog est basé sur CWA?

Réponses

5 PauloMoura Nov 26 2020 at 14:08

Quand on parle de l'hypothèse du monde fermé (CWA) dans le contexte de Prolog, une distinction doit être faite entre les prédicats inconnus et les prédicats connus du système (d'exécution). Dans les deux cas, prédicats avec ou sans clauses.

L'appel d'un prédicat inconnu déclenchera, par défaut, une erreur d'existence de prédicat. Il existe un indicateur standard unknown, dont la valeur par défaut est error, qui peut être défini sur fail. Cela vous donnera le comportement que vous recherchez apparemment. Sill, je vous conseille fortement de garder l'indicateur défini sur sa valeur par défaut de error, car il permet une détection plus facile des prédicats de programmation (par exemple des fautes de frappe dans les noms de prédicat ou l'arité).

Qu'est-ce qui fait connaître un prédicat au runtime? Directives de prédicat ou clauses de prédicat. L'exemple le plus connu est la dynamic/1directive. Si votre code se compose uniquement du texte suivant:

:- dynamic(foo/1).

Ensuite, après la compilation et le chargement, vous pouvez vous attendre:

?- foo(_).
no.

Mais d'autres directives ont le même effet (par exemple multifile/1et discontiguous/1, en supposant qu'il s'agit d'une implémentation Prolog conforme à la norme!).

Ainsi, pour les prédicats connus , l'interprétation de CWA dans Prolog est simple: ce que nous ne pouvons pas prouver est vrai, est faux. C'est-à-dire négation par échec , ce qui n'est pas la même chose que la négation logique . Le nom Prolog vient de la programmation en logique mais Prolog vise également à être un langage de programmation pragmatique et pratique.

Ce qui manque à Prolog (et est fourni par exemple par Logtalk ), c'est de pouvoir déclarer un prédicat sans être forcé de le déclarer comme dynamique, ou multifichier, ou ... ou exiger de lui fournir des clauses (voir par exemple cet exemple ). Cela fournit une sémantique CWA plus simple et plus claire: l'appel d'un prédicat déclaré sans clause échoue (sans avoir besoin de jouer avec l' unknownindicateur problématique ); l'appel d'un prédicat non déclaré déclenche une erreur d'existence de prédicat.

J'espère que cela t'aides. La recherche de la négation comme échec devrait apporter des éclaircissements supplémentaires.

1 rajashekar Nov 26 2020 at 01:39

Votre requête doit être dans le langage lui-même, car apour être une proposition a/0doit être dans le langage, c'est-à-dire défini comme un prédicat. Tous les prédicats nuls dans le langage sont des propositions. Vous ne pouvez pas interroger un nouveau terme en tant que prédicat sans l'ajouter au préalable à la langue.

Car a/1lorsque vous le définissez tel a(b).qu'il est dans le langage, alors la requête a(X), dif(X,b)échouera puisque le système prologue ne connaît aucun autre terme qui le satisfait et en supposant qu'il n'y en a pas d'autre dans le monde proche.