我必须执行一些函数,其中之一是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