2014-02-24 62 views
2

我必須執行一些函數,其中之一是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類型的嗎?

謝謝!

+2

這不是按位求反。這是按位補全。例如,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

+0

@mbratch:假設2s補碼。 – false

+0

@false是的,對不起,我應該提到。 – lurker

回答

4

(\)/1是用於按位補碼的可評估仿函數。如果直接在參數中使用它,它只是一個未解釋的仿函數。評估僅與(is)/2,(>)/2和其他比較運算符一起執行。

在目前所有的Prolog實現你:

?- X is \ 1. 
X = -2. 

小字:一個符合ISO系統可以自由定義\值。也就是說,它是免費的,無論是使用2的補碼還是其他表示。但是,只有系統使用2的補碼。

+0

那麼這個函數的實現是否正確? –

+1

@Slim_Shady:這是2s補碼的按位補碼。 – false

+1

@Slim_Shady:不,你的功能不正確 – CapelliC

1

您對該公式的實施似乎有缺陷。

您需要關於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已經被正確地轉換之後)

+0

沒有(...)的實現是我最初的做法...它的工作原理是一樣的,但我的老師說這不是很好..我應該用'p(\ X)'替換'not(p(X))'。儘管謝謝你的解釋! –

+1

我不明白...你不能將\運算符應用於原子。那麼你應該認定p/1和q/1。完全沒用。 – CapelliC