2017-05-08 3 views
0

ich ein Constraint-Solver in Prolog schreibe, die eine einfache logische Formel implementiert:Darstellen logische Disjunktionen in Constraint Handling Rules

"(alive(A) and animal(A)) iff (awake(A) or asleep(A))".

fand ich einen Weg, es in Constraint Handling Rules zu implementieren, aber es ist viel ausführlicher als die ursprüngliche Formel:

:- use_module(library(chr)). 

:- chr_constraint is_true/1. 
is_true(A) \ is_true(A) <=> true. 

is_true(alive(A)),is_true(animal(A)) ==> is_true(awake(A));is_true(asleep(A)). 
is_true(awake(A)) ==> is_true(animal(A)),is_true(alive(A)). 
is_true(asleep(A)) ==> is_true(animal(A)),is_true(alive(A)). 

Wäre es möglich, diese Formel anstelle von mehreren redundanten unter Verwendung einer einzigen Anweisung zu implementieren Aussagen?

Antwort

3

Dies ist keine direkte Antwort auf Ihre wörtliche Frage. Dennoch möchte ich noch auf eine alternative Lösung insgesamt hinweisen: Zumindest in diesem konkreten Fall sind alle Aussagen Aussagen Aussagen, und so können Sie den gesamten Satz als Boolean   Einschränkung über die Vorschläge modellieren.

Zum Beispiel mit   CLP (B):

 
?- sat((Alive_A * Animal_A) =:= (Awake_A + Asleep_A)). 

Wenn Sie nun eine der Variablen instanziiert, die Constraint-Solver ausbreitet automatisch alles, was es   kann. Zum Beispiel:

 
?- sat((Alive_A * Animal_A) =:= (Awake_A + Asleep_A)), 
    Animal_A = 0. 
Animal_A = Awake_A, Awake_A = Asleep_A, Asleep_A = 0, 
sat(Alive_A=:=Alive_A). 

Aus der Tatsache, dass Alive_A noch ungebunden ist, kann man sagen, dass beiden Wahrheitswerte noch zulässig sind.