Variables distinctes pour différentes clauses

10

Dans la démonstration du théorème de résolution, il est normalement supposé que les variables dans différentes clauses sont distinctes. Ce n'est pas quelque chose qui se produit automatiquement; il nécessite du code et des calculs supplémentaires importants à implémenter. Compte tenu de cela, je cherche un cas de test pour cela.

Le problème est que, dans tous les cas de test que j'ai essayés jusqu'à présent, cela ne fait aucune différence. Vraisemblablement, cela n'a d'importance que dans les cas marginaux inhabituels. Comme le dit Wikipedia , "les variables dans différentes clauses sont distinctes ... Maintenant, unifier Q (X) dans la première clause avec Q (Y) dans la deuxième clause signifie que X et Y deviennent de toute façon la même variable."

Existe-t-il des cas de test connus qui donneront réellement la mauvaise réponse si différentes clauses utilisent les mêmes variables?

rwallace
la source

Réponses:

6

Edit: j'ai trouvé un meilleur exemple. Considérez ces clauses: Évidemment, cet ensemble de clauses est contradictoire. Mais sans renommer les variables, le seul résolvant possible est et plus aucun résolvant n'est possible - tous conduisent à substituer à , ce qui est impossible. P(f(x))f(x)x

¬P(x)P(f(x))P(x)¬P(f(f(x)))
P(f(x))f(x)x

Edit: Réfléchissez à la signification des clauses. Chaque clause est implicitement universellement quantifiée. La signification de ses variables n'est donc fixée à rien. Supposons maintenant que vous ayez deux clauses contenant chacune . Si vous effectuez une résolution sans renommer dans l'un d'eux, alors vous ajoutez un sens à qu'il n'a pas: vous dites que signifie la même chose dans les deux clauses, ce qui n'est pas vrai. Si vous n'avez pas de variables distinctes dans vos clauses, la résolution vous donnera des conclusions trop faibles.x x xxxxx


(La réponse d'origine.) Par exemple, nous allons avoir 4 clauses:

  1. AB(x)
  2. ¬AC(x)
  3. ¬B(c)
  4. ¬C(d)

où sont des variables et des constantes . Si nous effectuons une résolution sur les deux premiers sans renommer , nous obtiendrons . Nous pouvons continuer avec pour obtenir mais maintenant nous ne pouvons pas le résoudre avec .c , d x B ( x ) C ( x ) ¬ B ( c ) C ( c ) ¬ C ( d )x,yc,dxB(x)C(x)¬B(c)C(c)¬C(d)

D'un autre côté, si nous renommons en dans le second pour avoir un ensemble de variables disjointes, nous obtiendrons partir de la première étape de résolution et nous pouvons dériver une clause vide en utilisant et .y B ( x ) C ( y ) ¬ B ( c ) ¬ B ( d )xyB(x)C(y)¬B(c)¬B(d)

Petr Pudlák
la source
Lorsque j'essaie cela dans mon prouveur avec des variables distinctes désactivées, il résout avec pour donner , obtient également et de là la clause vide, donc le résultat final est le même. Suis-je en train de manquer quelque chose? ¬ B ( c ) A ¬ AB(x)¬B(c)A¬A
rwallace
@rwallace Ne pas avoir de variables distinctes ne signifie pas que vous ne pouvez pas dériver la clause vide, juste que les méthodes ne sont pas complètes. Si vous renommez toujours des variables, peu importe l'ordre dans lequel vous choisissez les clauses, vous dériverez toujours la clause vide si l'ensemble d'origine n'est pas satisfaisant - la méthode est terminée. Mais, si vous ne renommez pas de variables, alors (comme le montre l'exemple), l'ordre importe soudainement - certaines séquences de dérivations ne trouveront pas la clause vide. Et, un prouveur ne peut pas "dire" à l'avance quelle séquence de dérivations est la bonne.
Petr Pudlák
Mais n'est-il pas vrai qu'une méthode complète doit finalement essayer toutes les dérivations possibles (sauf si elle trouve d'abord la clause vide)? Pour être sûr qu'il n'y a aucune garantie, il essaiera les dérivations que j'ai mentionnées avant celles que vous avez mentionnées, mais lorsque celles que vous avez mentionnées échouent en raison du manque de variables distinctes, celles que j'ai mentionnées sont toujours ouvertes et une méthode complète doit revenir en arrière et essayer tôt ou tard?
rwallace
Votre addendum concernant le sens des clauses dans l'abstrait est logique, mais il me semble que si tel est le cas, il devrait être possible de trouver un cas de test, quelque chose que je puisse alimenter dans un prouveur et lui faire donner la mauvaise réponse si la fonction de variables distinctes est désactivée. Je n'ai tout simplement pas pu trouver un tel cas de test jusqu'à présent.
rwallace
@rwallace Pourquoi voudriez-vous faire cela? La résolution est une méthode complète et vous savez qu'en toutes circonstances, il n'est nécessaire d'effectuer une résolution sur chaque paire de clauses qu'une seule fois. Vous proposez éventuellement d'essayer toutes les séquences possibles sur la façon de procéder au retour en arrière. Cela se traduira par une augmentation vraiment énorme de la complexité de l'algorithme, même pas comparable à distance avec simplement renommer des variables à chaque étape.
Petr Pudlák