我必須執行一些函數,其中之一是f =〜p/\〜q。在序言中,按位否定運算符()是做什麼的?
我有以下:
p(a). p(b).
q(a). q(b). q(c).
我發現功能爲:。
f(X):-p(\X);q(\X).
當我確認它(F(X)中,f(A)中,f(b)中。,f(c)。)它總是返回false。
不應該爲c返回true,因爲c不是p類型的嗎?
謝謝!
我必須執行一些函數,其中之一是f =〜p/\〜q。在序言中,按位否定運算符()是做什麼的?
我有以下:
p(a). p(b).
q(a). q(b). q(c).
我發現功能爲:。
f(X):-p(\X);q(\X).
當我確認它(F(X)中,f(A)中,f(b)中。,f(c)。)它總是返回false。
不應該爲c返回true,因爲c不是p類型的嗎?
謝謝!
您對該公式的實施似乎有缺陷。
您需要關於f : (not p) and (not q)
受限否定可用在Prolog中,使用operator (\+)/1
,和結合(X和Y)由逗號即(,)/2
表達。
分號即(;)/2
表示or
,例如在下面的測試中,它表明你對f(c)
的初始假設也是錯誤的。
?- forall(member(X,[a,b,c,d]),(f(X)->writeln(y);writeln(n))).
n
n
n
y
(當然,F/1已經被正確地轉換之後)
沒有(...)的實現是我最初的做法...它的工作原理是一樣的,但我的老師說這不是很好..我應該用'p(\ X)'替換'not(p(X))'。儘管謝謝你的解釋! –
我不明白...你不能將\運算符應用於原子。那麼你應該認定p/1和q/1。完全沒用。 – CapelliC
這不是按位求反。這是按位補全。例如,f(a)'返回false,因爲@false在他的回答中指出,在這個上下文中的反斜槓就像一個未解釋的仿函數。所以'p(\ a)'既不是事實,也不是'q(\ a)'。因此,'p(\ a); q(\ a)'失敗。對於反斜槓來進行按位補碼,它必須與'is/2'或數字比較器一起使用,例如*,'X = 1,Y是\ X.'產生'Y = -2'(使用@ false的例子) ,因爲'1'是十六進制的'00000001','-2'是十六進制的'FFFFFFFE'(假設是32位字)。 – lurker
@mbratch:假設2s補碼。 – false
@false是的,對不起,我應該提到。 – lurker