代码之家  ›  专栏  ›  技术社区  ›  user797257

简单布尔表达式测试

  •  2
  • user797257  · 技术社区  · 12 年前
    | ?- [user].
    compiling user for byte code...
    formula_0(P, Q):- (P; Q), \+ P.
    
    user compiled, 2 lines read - 768 bytes written, 37208 ms
    
    yes
    | ?- formula_0(P, Q).
    uncaught exception: error(instantiation_error,formula_0/2)
    

    我基本上想做的就是问 表达式{P或Q,~P}的集合是可满足的吗?

    但错误消息在这里没有帮助。。。

    PS。答案应该是“是”,当P=假,Q=真时,这个公式就成立了。

    3 回复  |  直到 12 年前
        1
  •  3
  •   mat    12 年前

    出现实例化错误的原因是对 P Q 在他们被用作目标的时候说任何关于他们的话。例如,当你问:

    ?- G.
    

    然后 G = true 是使查询成功的解决方案。但例如 G = (a=a) 因为 a=a 也是如此。由于不可能列举所有目标 G 如果成功,则会出现实例化错误。但请注意,例如,当您显式给出绑定时,您会得到您期望的结果:

    ?- G = true, G.
    G = true.
    

    因此,您应该提供一组您感兴趣的值:

    ?- maplist(boolean, [P,Q]), formula(P, Q).
    

    并定义例如:

    boolean(true).
    boolean(false).
    

    以获得具体的解决方案。或使用 约束条件 ,允许您在使用变量之前约束变量的域。

    编辑 :由于对此进行了一些讨论,我将详细介绍。出现的主要问题是:为什么要进行查询

    ?- Q.
    

    唯一的解决方案无法成功

    Q = true.
    

    因为显然, true 成功,因此是一个有效的解决方案吗?答案:还有其他可能的答案,因为 真实的 并不是唯一成功的目标。例如,连词 (true,true) 同样成功。现在假设 Q = true 如果是上述查询的唯一解决方案,那么情况将是:

    ?- Q, Q = (true, true).
    

    失败 (自 dif(true, (true,true)) 这本身就是真的),但只是简单地交换目标

    ?- Q = (true,true), Q.
    

    成功 因为除此之外 ?- true, true 也必须失败,而事实并非如此。这将违反最基本谓词(统一)已经存在的连词的交换性。

    请注意,尽管 真实的 (真的,真的) 二者都 当作为目标执行时,它们显然是成功的 不同的术语 并且通常不能相互替换。类似地,术语 append([], [], []) 与术语不同 真实的 ,尽管两者在作为目标执行时都取得了成功。因此,您会得到一个实例化错误,因为对 Q 在类似的查询中 ?- Q. 以给出有用的结果。

        2
  •  3
  •   repeat    10 年前

    使用 对于 c 约束 逻辑控制器 p 编程结束 B 奥兰人。

    :- use_module(library(clpb)).
    

    示例查询:

    ?- sat((P+Q) * ~P).
    P = 0, Q = 1.                   % succeeds deterministically
    
        3
  •  1
  •   CapelliC    12 年前

    Gnu Prolog支持“裸变量”调用,这是一种语法功能,允许编写如中所示的代码 formula_0/2 。但是当谈到 执行 它,变量必须绑定!

    | ?- P.            
    uncaught exception: error(instantiation_error,top_level/0)
    
    | ?- P=write(1), P.
    1
    P = write(1)
    

    那就用吧 可赎回资产 :

    | ?- formula_0(fail,true). 
    yes
    
    推荐文章