Определение ограничений CHR во время выполнения
Я пытаюсь написать программу, которая генерирует новые ограничения во время выполнения в 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 во время выполнения?
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)).