在运行时定义CHR约束

在运行时定义CHR约束

问题描述:

我正试图编写一个程序,该程序在运行时在SWI-Prolog中生成新约束。 is_true([A,means,B])意在运行时产生另一个约束:在运行时定义CHR约束

:- 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限制?

可以通过定义一个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).