【问题标题】:How to remove solutions from a Prolog program如何从 Prolog 程序中删除解决方案
【发布时间】: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


    【解决方案1】:

    您可以对不想要的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 的所有尝试都失败了,并且这些尝试是有限的(例如,程序不会陷入无限循环,并且分支的数量是有限的)。

    上面是一个generate-and-test方法:我们首先generateAB生成值,然后test如果这些是有效的。但是,如果您已经知道对于A 的给定值,B 的所有值是否都会失败,那么最好进行交错测试。然而,这里似乎我们只能测试 AB 是否已知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      相关资源
      最近更新 更多