【发布时间】:2019-06-21 04:45:43
【问题描述】:
鉴于这个程序:
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
【问题讨论】:
标签: 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
【问题讨论】:
标签: prolog
您可以对不想要的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 的所有尝试都失败了,并且这些尝试是有限的(例如,程序不会陷入无限循环,并且分支的数量是有限的)。
上面是一个generate-and-test方法:我们首先generate为A和B生成值,然后test如果这些是有效的。但是,如果您已经知道对于A 的给定值,B 的所有值是否都会失败,那么最好进行交错测试。然而,这里似乎我们只能测试 A 和 B 是否已知。
【讨论】: