2014-02-24 31 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