给出该程序:
a(1). a(2). a(3).
b(1). b(2). b(3).
ab(A, B) :- a(A), b(B).
此查询返回9个项目:
ab(A, B).
如何删除某些特定的行,例如(1,2)和(3,1)行并得到此结果?
1 1
1 3
2 1
2 2
2 3
3 2
3 3
答案 0 :(得分:2)
您可以为不需要的A
和B
的值列表编码,例如:
not_ab(1,2).
not_ab(3,1).
然后,您可以使用\+/1
predicate [swi-doc]作为否定符:
ab(A, B) :-
a(A),
b(B),
\+ not_ab(A, B).
请注意,Prolog的否定是否定有限失败。因此,这意味着\+ Goal
成功,即使所有满足Goal
的尝试都失败了,并且这些尝试是有限的(例如,程序不会陷入无限循环,并且调用次数是有限)。
上面是生成并测试方法:我们首先为A
和B
生成值,然后进行 test (如果有效)。但是,如果您已经知道对于A
的给定值,B
的所有值都会失败,那么最好进行交错测试。但是在这里看起来好像我们只能测试A
和B
是否都知道。