我正在研究諸如吸血鬼和E-Prover這樣的一階邏輯定理證明器,並且TPTP語法似乎是要走的路。我對邏輯編程語法比較熟悉,例如Answer Set Programming和Prolog,雖然我嘗試引用TPTP syntax的詳細描述,但我仍然不明白如何正確區分解釋函數和非解釋函子(而且我可能使用術語錯誤)。在TPTP中表示語法上不同的術語
本質上,我試圖通過證明沒有模型作爲反例來證明一個定理。我的第一個困難是我沒有想到下面的邏輯程序是可以滿足的。
fof(all_foo, axiom, ![X] : (pred(X) => (X = foo))).
fof(exists_bar, axiom, pred(bar)).
,因爲沒有什麼能阻止bar
從等於foo
這的確是滿足的。所以第一個解決方案是堅持這兩個術語是不同的,我們獲得以下不可滿足的計劃。
fof(all_foo, axiom, ![X] : pred(X) => (X = foo)).
fof(exists_bar, axiom, pred(bar)).
fof(foo_not_bar, axiom, foo != bar).
的Techinal報告闡明瞭不同的雙引號中的字符串是不同的對象確實是,所以另一種解決方案是在這裏和那裏提出報價,從而獲得以下不可滿足的程序。
fof(all_foo, axiom, ![X] : (pred(X) => (X = "foo"))).
fof(exists_bar, axiom, pred("bar")).
我很高興沒有手動指定不等式,因爲這顯然不會擴展到更真實的場景。靠近我的真實情況,我實際上必須處理組成條款,並且不幸的是下面的程序是令人滿意的。
fof(all_foo, axiom, ![X] : (pred(X) => (X = f("foo")))).
fof(exists_bar, axiom, pred(g("bar"))).
我猜f("foo")
不是一個詞,但應用到對象"foo"
功能f
。所以它可能會與功能g
重合。儘管手動規範f
和g
從來不會一致,但下面的程序是不可滿足的,我覺得我做錯了。它可能不會擴展到我的真實環境,大量的術語在語法上不同時被解釋爲獨特。
fof(all_foo, axiom, ![X] : (pred(X) => (X = f("foo")))).
fof(exists_bar, axiom, pred(g("bar"))).
fof(f_not_g, axiom, ![X, Y] : f(X) != g(Y)).
我嘗試過扔單引號,但我沒有找到正確的方法來做到這一點。
如何製作句法不同(組合)的術語並測試語法上的相等性?
輔助問題:以下程序是可以滿足的,因爲自動定理證明器將f
理解爲函數而不是未解釋函數。
fof(exists_f_g, axiom, (?[I] : ((f(foo) = f(I)) & pred(g(I))))).
fof(not_g_foo, axiom, ~pred(g(foo))).
爲了使它不可滿足,我需要手動指定f是內射的。沒有指定我的程序中發生的所有函子的注入性,得到這種行爲的自然方法是什麼?
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))).
謝謝,這說明了一點。對於雙引號,我從[技術報告](http://www.cs.miami.edu/~tptp/TPTP/TR/TPTPTR.shtml#FormulaeSection)聽說過它們(這也是我相信的部分可能有一種方法可以通過語法記下不相等的術語,並且不用公理化唯一的名稱假設和注入)。 另外,它似乎一次指定多個猜測是不贊同的,但我可以肯定地重新闡述我的問題,使我的猜測明確。 – Abdallah
我剛剛用E 1.8和SPASS 4.6檢查了雙引號的支持 - 它們都可以讀取術語'''fof(c1,conjecture,〜(「a」=「b」))。「''但只有E反駁它。 SPASS套件中的tptp2dfg工具只爲「a」和「b」創建不同的常量,但不添加差異公理。多重猜測的問題在於規範要求證明它們的結合,但是一些證明者證明了這種分離。這引出了一般性評論:TPTP格式是不同證明者支持的語言的超集(例如$ ite),所以更好地在手冊中仔細檢查。 –
對不起,它應該是SPASS 3.7 - 我總是混淆版本號。 –