如何从Prolog程序中删除解决方案

时间:2019-06-20 17:25:37

标签: prolog

给出该程序:

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

1 个答案:

答案 0 :(得分:2)

您可以为不需要的AB的值列表编码,例如:

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的尝试都失败了,并且这些尝试是有限的(例如,程序不会陷入无限循环,并且调用次数是有限)。

上面是生成并测试方法:我们首先为AB 生成值,然后进行 test (如果有效)。但是,如果您已经知道对于A的给定值,B的所有值都会失败,那么最好进行交错测试。但是在这里看起来好像我们只能测试AB是否都知道。