【问题标题】:Prolog boolean equation solveProlog 布尔方程求解
【发布时间】:2014-09-12 07:49:22
【问题描述】:

到目前为止,我已经让这个程序在 GNU prolog 中运行

not(X) :- \+ X.  
and(X, Y):-  X , Y.  
or(X, Y):-   X ; Y. 
implies(X, Y):- \+ X ; Y.  

p.
q.

:- initialization(main).

main :- 
    write('Program start'), nl.

您可以输入 and(p,q) 得到是,也可以输入 and(p,not(q)) 得到否定。现在我想做这样的事情:

我将 p 设置为 true,(通过使用 p.) 初始化它,并且 (and(p,q)) 设置为 true(但没有初始化 q),我想让 prolog 说: 存在一种解决方案:“q”必须为真

如果我将 p 和 (or(p,q)) 设置为 true,我希望 prolog 说: 存在两种解决方案,“q”可以是真或假。最好的方法是什么?

【问题讨论】:

    标签: prolog clpb


    【解决方案1】:

    我建议您使用变量而不是 pq 并将其包装在某个术语中,例如

    and(prop(P),prop(Q))
    

    另外,我将实现两个谓词,一个用于解决真实陈述,一个用于解决错误陈述。使用\+ 不是正确的方法,因为它不允许您绑定变量。下面是一些示例代码:

    formula_true(prop(true)).
    formula_true(and(A,B)) :- formula_true(A),formula_true(B).
    formula_true(not(A)) :- formula_false(A).
    ...
    
    formula_false(prop(false)).
    formula_false(and(A,B)) :- formula_false(A);formula_false(B).
    ...
    

    您的示例查询将是:

    P=true,formula_true(and(prop(P),prop(Q))).
    

    也许你有一个比formula_true 更好的名字。 formula_false。 :)

    如果你有一个布尔约束求解器,那当然会更有效。

    【讨论】:

    • +1 使用了如此干净的表示! (这让您可以通过函子区分实体)。
    【解决方案2】:

    考虑使用带有布尔约束求解器的 Prolog 系统。比如SICStusSWI-Prolog

    ?- use_module(library(clpb)).
    true.
    
    ?- P = 1, sat(P * Q).
    P = Q, Q = 1.
    
    ?- P = 1, sat_count(P + Q, Count).
    Count = 2,
    P = 1.
    
    ?- P = 1, sat(P + Q), labeling([P,Q]).
    P = 1,
    Q = 0 ;
    P = Q, Q = 1.
    

    您还可以使用 GNU Prolog 的有限域约束求解器,因为布尔值是整数的一种特殊情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多