我必须实现一些函数,其中一个函数是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?
谢谢!
答案 0 :(得分:4)
(\)/1
是用于按位补码的可评估函子。如果直接在参数中使用它,它只是一个未被解释的仿函数。仅使用(is)/2
,(>)/2
和其他比较运算符执行评估。
在目前所有Prolog实施中,您将获得:
?- X is \ 1.
X = -2.
精细打印:符合ISO标准的系统可以自由定义\
的值。也就是说,它是免费的,无论是使用2的补码还是其他表示。但是,只有系统使用2的补码。
答案 1 :(得分:1)
您对该公式的实施似乎存在缺陷。
您需要f : (not p) and (not q)
Prolog中可以使用运算符(\+)/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翻译正确后)