Je jette un coup d'oeil aux démonstrateurs de théorème de logique du premier ordre tels que Vampire et E-Prover, et la syntaxe de TPTP semble être la voie à suivre. Je suis plus familier avec les syntaxes de Programmation Logique telles que Answer Set Programming et Prolog, et bien que j'essaie de me référer à la description détaillée du TPTP syntax, je ne sais toujours pas comment distinguer correctement le foncteur interprété et non interprété (et je pourrais utiliser la terminologie erronée). Essentiellement, j'essaie de prouver un théorème en montrant qu'aucun modèle n'agit comme un contre-exemple. Ma première difficulté était que je ne m'attendais pas à ce que le programme logique suivant soit satisfaisant.Représente des termes syntaxiquement différents dans TPTP
fof(all_foo, axiom, ![X] : (pred(X) => (X = foo))).
fof(exists_bar, axiom, pred(bar)).
Il est en effet satisfiable parce que rien n'empêche bar
d'être égal à foo
. Donc une première solution serait d'insister sur le fait que ces deux termes sont distincts et nous obtenons le programme insatisfiable suivant.
fof(all_foo, axiom, ![X] : pred(X) => (X = foo)).
fof(exists_bar, axiom, pred(bar)).
fof(foo_not_bar, axiom, foo != bar).
Le rapport précise que techinal différentes chaînes entre guillemets sont des objets différents en effet, si une autre solution est de mettre des guillemets ici et là, afin d'obtenir le programme suivant insatisfiable. Je suis heureux de ne pas avoir spécifié manuellement l'inégalité car cela ne serait évidemment pas à l'échelle d'un scénario plus réaliste. En me rapprochant de ma situation réelle, je dois gérer des termes composés, et le programme suivant est malheureusement satisfaisant.
fof(all_foo, axiom, ![X] : (pred(X) => (X = f("foo")))).
fof(exists_bar, axiom, pred(g("bar"))).
Je suppose que f("foo")
est pas un terme, mais la fonction f
appliquée à l'objet "foo"
. Il pourrait donc coïncider avec la fonction g
. Bien qu'une spécification manuelle qui f
et g
ne coïncide jamais, le programme suivant est insatisfiable, je me sens comme je le fais mal. Et il ne s'agirait probablement pas de mon véritable environnement avec beaucoup de termes à interpréter comme distincts quand ils sont syntaxiquement distincts. J'ai essayé de lancer des guillemets simples, mais je n'ai pas trouvé la bonne façon de le faire. Comment faire des termes (composés) syntaxiquement différents et tester l'égalité syntaxique? Question subsidiaire: le programme suivant est satisfiable, car le prouveur de théorème automatisé comprend f
comme une fonction plutôt qu'un foncteur non interprété.
fof(exists_f_g, axiom, (?[I] : ((f(foo) = f(I)) & pred(g(I))))).
fof(not_g_foo, axiom, ~pred(g(foo))).
Pour le rendre insatisfiable, je dois spécifier manuellement que f est injective. Quel serait le moyen naturel d'obtenir ce comportement sans spécifier l'injectivité de tous les foncteurs qui se produisent dans mon programme?
fof(exists_f_g, axiom, (?[I] : ((f(foo) = f(I)) & pred(g(I))))).
fof(not_g_foo, axiom, ~pred(g(foo))).
fof(f_injective, axiom, ![X,Y] : (f(X) = f(Y) => (X = Y))).
Merci, cela clarifie un peu. Pour les guillemets, j'ai entendu parler d'eux dans le [rapport technique] (http://www.cs.miami.edu/~tptp/TPTP/TR/TPTPTR.shtml#FormulaeSection) (c'était aussi la partie qui me faisait croire) il aurait pu y avoir un moyen d'écrire un terme inégal par la syntaxe et sans axiomatiser l'hypothèse de nom unique et l'injectivité). En outre, il semble que la spécification de plusieurs conjectures à la fois est déconseillée, mais je peux certainement reformuler mon problème pour rendre ma conjecture explicite. – Abdallah
Je viens de vérifier le support des guillemets avec E 1.8 et SPASS 4.6 - les deux peuvent lire le terme '' '' fof (c1, conjecture, ~ ("a" = "b")) .''' mais seulement E réfute il. L'outil tptp2dfg de la suite SPASS crée simplement différentes constantes pour "a" et "b" mais n'ajoute pas l'axiome de différence. Le problème avec de multiples conjectures était que la spécification requise pour prouver leur conjonction, mais certains prouveurs prouvent la disjonction. Ce qui amène un peu à un commentaire général: le format TPTP est un sur-ensemble du langage supporté par les différents prouveurs (par exemple $ ite), donc mieux revérifier dans le manuel. –
Désolé, il aurait dû être SPASS 3.7 - Je confond toujours les numéros de version. –