2017-08-12 6 views
4

実行時に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制約を定義する別の方法がありますか?

答えて

0

この問題を回避するには、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). 
関連する問題