【问题标题】:Defining CHR constraints at runtime在运行时定义 CHR 约束
【发布时间】:2017-08-12 23:12:25
【问题描述】:

我正在尝试在 SWI-Prolog 中编写一个在运行时生成新约束的程序。 is_true([A,means,B]) 旨在在运行时生成另一个约束:

:- use_module(library(chr)).
:- chr_constraint is_true/1.

is_true([A,means,B]) ==> (is_true(A) ==> is_true(B),writeln('asserted')).
is_true([[A,is,true],means,[A,is,not,false]]).
is_true([something,is,true]).

但是当我输入这些查询时,is_true 约束似乎没有任何效果。 is_true([something, is, not, false]) 不返回true

?- is_true([something,is,true]).
true .

?- is_true([something,is,not,false]).
is_true([something, is, not, false]).

在控制台中断言约束似乎也没有效果:

?- asserta(is_true(A>B)==>(is_true(B<A),writeln("asserted"))).
true.

?- is_true(4>3).
is_true(4>3).

还有其他方法可以在运行时定义新的 CHR 约束吗?

【问题讨论】:

    标签: swi-prolog constraint-handling-rules


    【解决方案1】:

    可以通过定义is_true/2 谓词来解决此问题。可以使用assertz/1 谓词在运行时更改此谓词。这不是一个理想的解决方案,但它适用于这种特殊情况。

    现在我可以这样写程序了:

    :- use_module(library(chr)).
    :- chr_constraint is_true/1.
    
    is_true(A) ==> is_true(A,B) | is_true(B).
    is_true([A,means,B]) ==> assertz(is_true(A,B)).
    is_true([],[]).
    

    并以这种方式在运行时添加新的约束:

    ̀?- is_true([[A,implies,B],means,[A,means,B]]).
    is_true([[A, implies, B], means, [A, means, B]]).
    
    ?- is_true([A>B,implies,B<A]).
    is_true([A>B, means, B<A]),
    is_true([A>B, implies, B<A]).
    
    ?- is_true(A>B).
    is_true(B<A),
    is_true(A>B).
    

    相反,为 CHR 编写“元解释器”可能更有用:

    :- initialization(main).
    :- set_prolog_flag('double_quotes','chars').
    :- use_module(library(chr)).
    :- chr_constraint is_true/1.
    
    is_true(X) \ is_true(X) <=> true.
    is_true(X ==> Y),is_true(X1) ==> copy_term((X -> Y),(X2 -> Y1)),(X2=X1,(is_true(X1)->is_true(Y1));X2\=X1),writeln(Y).
    is_true((X;Y)) ==> is_true(X);is_true(Y).
    is_true((X,Y)) ==> is_true(X),is_true(Y).
    is_true(is_true(X)) ==> is_true(X).
    is_true(X),is_true(\+X) ==> false.
    
    
    main :-
        is_true(is_person(A)==>is_mammal(A)),
        is_true(is_mammal(A)==>is_animal(A)),
        is_true(is_person(sue)),is_true(is_person(bob)).
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多