Download presentation
Presentation is loading. Please wait.
Published byAnnis Gray Modified over 9 years ago
1
Integrity constraints & constraint logic programming Henning Christiansen Roskilde University, Denmark henning@ruc.dk INAP’99, Invited DDLP’99 talk
2
Constraint logic programming (CLP) 1980'ies:Built-in constraint solvers, e.g., CLP(R) 1990'ies:Constraint solving as programming paradigm, language support, e.g., Constraint Handling Rules (CHR) 2000'ies:Efficient (WAM-like) impl's of CHR and similar programming languages CLP expands to more and more applications This talk: Applying CLP for evaluation of integrity constraints
3
Motivation Names of phenomena overlap: Integrity constraint/constraint logic programming
4
Motivation Names of phenomena overlap: Integrity constraint/constraint logic programming IC's: Knowledge about database for improved query-answering: – controlling update request – intentional answers – semantic query optimization – usually avioded, approximated by update routines/simple checks
5
Motivation Names of phenomena overlap: Integrity constraint/constraint logic programming IC's: Knowledge about database for improved query-answering: – controlling update request – intentional answers – semantic query optimization – usually avioded, approximated by update routines/simple checks CLP: A declarative, computational paradigm – delay’s – incrementality: self-simplifying, self-specializing code – produces general (quantified) answers Relevant for ICs!
6
The idea: Lazy negation-as-failure Restrict to positive DDB's (with ”=” and ”dif”), and IC's as ”denials”: bottom :- father(A,_), mother(A,_) bottom:- father(A,C), father(B,C), dif(A,B) tested by negation-as-failure that bottom is not the case.
7
The idea: Lazy negation-as-failure Restrict to positive DDB's (with ”=” and ”dif”), and IC's as ”denials”: bottom :- father(A,_), mother(A,_) bottom:- father(A,C), father(B,C), dif(A,B) tested by negation-as-failure that bottom is not the case. Lazyness?? A prospective update => a (constrained) ”hole” in the database Procedure delays when ”hole” is met Resulting computation: – known part of DB checked, specialized constr’s remain for ”holes”, – wakes up when update arrives, checking it –... and mutating into new specialized constraints for future updates.
8
The idea: Lazy negation-as-failure Restrict to positive DDB's (with ”=” and ”dif”), and IC's as ”denials”: bottom :- father(A,_), mother(A,_) bottom:- father(A,C), father(B,C), dif(A,B) tested by negation-as-failure that bottom is not the case. Lazyness?? A prospective update => a (constrained) ”hole” in the database Procedure delays when ”hole” is met Resulting computation: – known part of DB checked, specialized constr’s remain for ”holes”, – wakes up when update arrives, checking it –... and mutating into new specialized constraints for future updates. I.e. Incrementality!
9
A meta-logic approach to lazy negation-as-failure Ground representation of object language, e.g.: DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ]
10
A meta-logic approach to lazy negation-as-failure Ground representation of object language, e.g.: DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Instance constraints: instance( s, t ) iff s, t name object S, T with T an instance of S Example: instance(p('X'), p(a))
11
Instance constraints reflect object var’s to Prolog Example: instance(p('X'), Z) Z = p(Z X ) Object unification = 2* instance + 1 Prolog unification
12
Instance constraints reflect object var’s to Prolog Example: instance(p('X'), Z) Z = p(Z X ) Object unification = 2* instance + 1 Prolog unification Example: Object level: p(a,X) = p(Y,b) Meta-level (= Prolog): instance(p(a,'X'), Z 1 ), instance(p('Y',b), Z 2 ), Z 1 =Z 2 Z 1 = p(a, Z X ), Z 2 = p(Z Y,b), Z 1 =Z 2 Z X =b, X Y =a Thus: Semantic prop’s of ground repr. with efficiency of nonground repr.
13
Solving instance constraints... (sketch) Straight-forward recursive decomposition, delay’s when first argument is a variable Interacts with user constraint constant(X) iff ” X names an object constant” Examples: instance(p('X'), Z) Z = p(Z X ) instance(p(X), Z) Z = p(Z X ), instance(X,Z X ) instance(p(X),Z), constant(X) constant(X), Z = p(X) I.e. meta-var’s covered by constant take ”active” part in computation
14
Lazy negation-as-failure (top-level procedure) Declaratively: fails( p, q ) iff p, q names of P, Q where Q fails in P, i.e. no with P |– Q Top-level of implementation: fails(P,Q):- instance(Q,Q 1 ), fails1(P,Q 1 ). where fails1( p, q 1 ) iff p, q names of P, Q 1 where not P |– Q 1 fails1 /2 implemented by constraint solver and auxiliary constraints.
15
Lazy negation-as-failure (top-level procedure) Declaratively: fails( p, q ) iff p, q names of P, Q where Q fails in P, i.e. no with P |– Q Top-level of implementation: fails(P,Q):- instance(Q,Q 1 ), fails1(P,Q 1 ). where fails1( p, q 1 ) iff p, q names of P, Q 1 where not P |– Q 1 fails1 /2 implemented by constraint solver and auxiliary constraints.... but let’s see some examples first
16
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ]
17
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: fails( DB 0, bottom)
18
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: fails( DB 0, bottom) A: yes
19
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: fails( DB 0 & [Clause], bottom)
20
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: fails( DB 0 & [Clause], bottom) A:... a complicated expression ready for all possibilities: Clause could be a father clause, a mother clause, or a new IC, i.e, bottom:-...
21
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: constant(A), constant(B), fails( DB 0 & [(father(A,B):- true)],bottom)
22
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: constant(A), constant(B), fails( DB 0 & [(father(A,B):- true)],bottom) A: fails1(jane=A),fails1((mary=B, dif(john,A)))
23
IC’s evaluated by lazy negation-as-failure (examples) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: constant(A), constant(B), no_duplicates(... ), fails( DB 0 & [(father(A,B):- true)],bottom) A: fails1(jane=A), fails1(mary=B)
24
Observations (preliminary) Constraint solver produces residual constraints similar to "simplification method" [Nicolas, 82; Sadri,Kowalski, 88], but here as by-product of checking the whole, parameterized database A flavour of constructive negation (later example: instantiates variables)
25
Incrementality for sequences of updates A new user constraint (example) : clause_pattern(F,(father(X,Y):-true),(constant(X),constant(Y))) iff all clauses in F obey pattern and constraints A new residual constraint: fails1( Prog, Atom * Clause(s), Continue ) iff for (each) instance of clause H: - B in Clause(s), the query H = Atom, B, Continue fails in Prog.
26
Incrementality for sequences of updates (example) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: clause_pattern(F,( father(X,Y):-true ),( constant(X),constant(Y) )), fails1( DB 0 & F, bottom), no_duplicates(... )
27
Incrementality for sequences of updates (example) DB 0 = [(bottom:- dif('A','B'), father('A','C'), father('B','C')), (bottom:- dif('A','B'), mother('A','C'), mother('B','C')), (bottom:- father('A','Z'), mother('A','X')), (father(john,mary):- true), (mother(jane,mary):- true) ] Q: clause_pattern(F,( father(X,Y):-true ),( constant(X),constant(Y) )), fails1( DB 0 & F, bottom), no_duplicates(... ) A: fails1( DB 0 & F,father(A 1,Z 1 )*F,mother(A 1,X 1 )), fails1( DB 0 & F,father(B 2,mary)*F, dif(john,B 2 )), fails1( DB 0 & F,(father(A 3,C 3 ),father(B 3,C 3 ))*F, dif(A 3,B 3 )) NB: Optimization for symmetric literals applied
28
View update, lazy N-a-F co-operates with abduction A constraint-based proof predicate for program synthesis: demo( p, q ) iff p, q names of P, Q where Q succeds in P
29
View update, lazy N-a-F co-operates with abduction A constraint-based proof predicate for program synthesis: demo( p, q ) iff p, q names of P, Q where Q succeds in P DB 1 = [(bottom:-....),..., (sibling('A','B'):-....),..., (father(john,mary):- true), (mother(jane,mary):- true) ]
30
View update, lazy N-a-F co-operates with abduction A constraint-based proof predicate for program synthesis: demo( p, q ) iff p, q names of P, Q where Q succeds in P DB 1 = [(bottom:-....),..., (sibling('A','B'):-....),..., (father(john,mary):- true), (mother(jane,mary):- true) ] Q: clause_pattern(F, (father...),...), clause_pattern(M, (mother...),...), fails1( DB 1 & F & M, bottom), no_duplicates(...) demo( DB 1 & F & M, sibling(bob,mary)).
31
View update, lazy N-a-F co-operates with abduction A constraint-based proof predicate for program synthesis: demo( p, q ) iff p, q names of P, Q where Q succeds in P DB 1 = [(bottom:-....),..., (sibling('A','B'):-....),..., (father(john,mary):- true), (mother(jane,mary):- true) ] Q: clause_pattern(F, (father...),...), clause_pattern(M, (mother...),...), fails1( DB 1 & F & M, bottom), no_duplicates(...) demo( DB 1 & F & M, sibling(bob,mary)). A: F = [(father(john,bob):-true) | F 1 ], or M = [(mother(jane,bob):-true) | F 1 ]
32
”Co-operative” human-machine dialogue (example) U:Isn’t aunt Dora the mother of Mary? Let's ask... Q: demo( DB 0, mother(dora,mary)) A: no
33
”Co-operative” human-machine dialogue (example) U:Isn’t aunt Dora the mother of Mary? Let's ask... Q: demo( DB 0, mother(dora,mary)) A: no U:!?!?Hmmmm, perhaps they forgot to add it to the database? Q: fails( DB 0 & [(mother(dora,mary):-true)], bottom)
34
”Co-operative” human-machine dialogue (example) U:Isn’t aunt Dora the mother of Mary? Let's ask... Q: demo( DB 0, mother(dora,mary)) A: no U:!?!?Hmmmm, perhaps they forgot to add it to the database? Q: fails( DB 0 & [(mother(dora,mary):-true)], bottom) A: no U:... but why? I'm confused... do you have a mother for Mary? Q: constant(A), demo( DB 0, mother(A, mary))
35
”Co-operative” human-machine dialogue (example) U:Isn’t aunt Dora the mother of Mary? Let's ask... Q: demo( DB 0, mother(dora,mary)) A: no U:!?!?Hmmmm, perhaps they forgot to add it to the database? Q: fails( DB 0 & [(mother(dora,mary):-true)], bottom) A: no U:... but why? I'm confused... do you have a mother for Mary? Q: constant(A), demo( DB 0, mother(A, mary)) A: A = jane (no more answers)
36
”Co-operative” human-machine dialogue (example) U:Isn’t aunt Dora the mother of Mary? Let's ask... Q: demo( DB 0, mother(dora,mary)) A: no U:!?!?Hmmmm, perhaps they forgot to add it to the database? Q: fails( DB 0 & [(mother(dora,mary):-true)], bottom) A: no U:... but why? I'm confused... do you have a mother for Mary? Q: constant(A), demo( DB 0, mother(A, mary)) A: A = jane (no more answers) U:So Jane is the only known mother, but why can't we add aunt Dora? Q: constant(A), fails( DB 0 & [(mother(A,mary):- true)], bottom)
37
”Co-operative” human-machine dialogue (example) U:Isn’t aunt Dora the mother of Mary? Let's ask... Q: demo( DB 0, mother(dora,mary)) A: no U:!?!?Hmmmm, perhaps they forgot to add it to the database? Q: fails( DB 0 & [(mother(dora,mary):-true)], bottom) A: no U:... but why? I'm confused... do you have a mother for Mary? Q: constant(A), demo( DB 0, mother(A, mary)) A: A = jane (no more answers) U:So Jane is the only known mother, but why can't we add aunt Dora? Q: constant(A), fails( DB 0 & [(mother(A,mary):- true)], bottom) A: A = jane (no more answers) U:... so Jane is the only possible mother...
38
Observations (continued) Constraint solver produces residual constraints similar to "simplification method" [Nicolas, 82; Sadri, Kowalski, 88], but here as by-product of checking the whole, parameterized database A flavour of constructive negation
39
Observations (continued) Constraint solver produces residual constraints similar to "simplification method" [Nicolas, 82; Sadri, Kowalski, 88], but here as by-product of checking the whole, parameterized database A flavour of constructive negation Implies an incremental evaluation of IC’s: for each update, evaluate it, and prepare for next update
40
Observations (continued) Constraint solver produces residual constraints similar to "simplification method" [Nicolas, 82; Sadri, Kowalski, 88], but here as by-product of checking the whole, parameterized database A flavour of constructive negation Implies an incremental evaluation of IC’s: for each update, evaluate it, and prepare for next update Use of constraints provides optimal interleaving with abductive procedure for free for view update (opp. algorithms [Decker, Kowalski & al, Denecker & al,...] with explicit scheduling)
41
Observations (continued) Constraint solver produces residual constraints similar to "simplification method" [Nicolas, 82; Sadri, Kowalski, 88], but here as by-product of checking the whole, parameterized database A flavour of constructive negation Implies an incremental evaluation of IC’s: for each update, evaluate it, and prepare for next update Use of constraints provides optimal interleaving with abductive procedure for free for view update (opp. algorithms [Decker, Kowalski & al, Denecker & al,...] with explicit scheduling) IC’s used to produce useful answers in human-machine dialogue (though not giving ”arguments”)
42
Observations (continued) Constraint solver produces residual constraints similar to "simplification method" [Nicolas, 82; Sadri, Kowalski, 88], but here as by-product of checking the whole, parameterized database A flavour of constructive negation Implies an incremental evaluation of IC’s: for each update, evaluate it, and prepare for next update Use of constraints provides optimal interleaving with abductive procedure for free for view update (opp. algorithms [Decker, Kowalski & al, Denecker & al,...] with explicit scheduling) IC’s used to produce useful answers in human-machine dialogue (though not giving ”arguments”)... now, let’s have a look at that constraint solver
43
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query
44
fails1(_,true) fail
45
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query fails1(_,true) fail fails1(P, (Q1,(A=B),Q2)) (A=B -> fails1(P,(Q1,Q2));true)
46
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query fails1(_,true) fail fails1(P, (Q1,(A=B),Q2)) (A=B -> fails1(P,(Q1,Q2));true) fails1(P, (Q1,dif(A,B),Q2)) A==B or both are constants or one is a variable free in (Q1,Q2) | (A==B -> true;fails1(P,(Q1,Q2)))
47
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query fails1(_,true) fail fails1(P, (Q1,(A=B),Q2)) (A=B -> fails1(P,(Q1,Q2));true) fails1(P, (Q1,dif(A,B),Q2)) A==B or both are constants or one is a variable free in (Q1,Q2) | (A==B -> true;fails1(P,(Q1,Q2))) fails1(P, (Q1, A, Q2)) A names an atom | fails1(P, A*P, (Q1,Q2))
48
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query fails1(_,true) fail fails1(P, (Q1,(A=B),Q2)) (A=B -> fails1(P,(Q1,Q2));true) fails1(P, (Q1,dif(A,B),Q2)) A==B or both are constants or one is a variable free in (Q1,Q2) | (A==B -> true;fails1(P,(Q1,Q2))) fails1(P, (Q1, A, Q2)) A names an atom | fails1(P, A*P, (Q1,Q2)) fails1(_, _*[], _) true
49
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query fails1(_,true) fail fails1(P, (Q1,(A=B),Q2)) (A=B -> fails1(P,(Q1,Q2));true) fails1(P, (Q1,dif(A,B),Q2)) A==B or both are constants or one is a variable free in (Q1,Q2) | (A==B -> true;fails1(P,(Q1,Q2))) fails1(P, (Q1, A, Q2)) A names an atom | fails1(P, A*P, (Q1,Q2)) fails1(_, _*[], _) true fails1(P, A*[C|Cs], Cont) fails1(P, A*C, Cont), fails1(P, A*Cs, Cont)
50
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query fails1(_,true) fail fails1(P, (Q1,(A=B),Q2)) (A=B -> fails1(P,(Q1,Q2));true) fails1(P, (Q1,dif(A,B),Q2)) A==B or both are constants or one is a variable free in (Q1,Q2) | (A==B -> true;fails1(P,(Q1,Q2))) fails1(P, (Q1, A, Q2)) A names an atom | fails1(P, A*P, (Q1,Q2)) fails1(_, _*[], _) true fails1(P, A*[C|Cs], Cont) fails1(P, A*C, Cont), fails1(P, A*Cs, Cont) fails1(P,A*(H:-B), Cont) copy_term((A,Cont),(A1,Cont1)), instance((H:-B),(H1,B1)), fails1(P,(H1=A1,B1, Cont1))
51
Constraint solver for lazy negation-as-failure – Simplified CHR’s; first version for known program and query fails1(P,A*(H:-B), Cont) copy_term((A,Cont),(A1,Cont1)), instance((H:-B),(H1,B1)), fails1(P,(H1=A1,B1, Cont1))
52
Adapt for partly known object program and query Definition: External variable: appears in arg's to fails Externally dependent variable A : A external or instance( External,... A... )
53
Adapt for partly known object program and query Definition: External variable: appears in arg's to fails Externally dependent variable A : A external or instance( External,... A... ) Replace copy_term by internal_copy_term : as copy_term, but keep external variables, copy instance constraints (also keeping external var’s)
54
Adapt for partly known object program and query Definition: External variable: appears in arg's to fails Externally dependent variable A : A external or instance( External,... A... ) Replace copy_term by internal_copy_term : as copy_term, but keep external variables, copy instance constraints (also keeping external var’s) Principle: –process literals where result (yes/no) is predictable, –delay for the rest (typically due to external variables) –various optimizations for = and dif
55
Correctness properties (still need to be formalized) Local soundness and completeness of each rule obvious
56
Correctness properties (still need to be formalized) Local soundness and completeness of each rule obvious Computation rule á la Prolog => termination á la Prolog
57
Correctness properties (still need to be formalized) Local soundness and completeness of each rule obvious Computation rule á la Prolog => termination á la Prolog More eager com. rule => better ”precision” in detecting inconsistencies early; problematic for recursive programs
58
Efficient implementations Prolog-like setting: Replace metainterpreter by extended WAM functionality copy_internal_term replaced by operations on WAM stacks CHR’s loop for rules-to-apply replaced by low-level message passing – allowing complex guards to simplify dynamically Needs more detailed control of unfolding in order to employ Prolog’s indexing techniques Ex: dif(peter,mary), dif(peter,dolly),.... => \+ mother(peter,_)
59
Efficient implementations Prolog-like setting: Replace metainterpreter by extended WAM functionality copy_internal_term replaced by operations on WAM stacks CHR’s loop for rules-to-apply replaced by low-level message passing – allowing complex guards to simplify dynamically Needs more detailed control of unfolding in order to employ Prolog’s indexing techniques Ex: dif(peter,mary), dif(peter,dolly),.... => \+ mother(peter,_) Relational database (RDB) setting: Use Prolog as ”semantic engine” interfaced with RDB as efficient fact base Embed functionality in RBD system
60
Conclusion Relating integrity constraints and constraint logic programming: –Integrity constraints represented as calls to CLP constraints Strategy: lazy negation-as-failure CLP provides –incremental evaluation –self-specializing, self-simplifying code – not unlike a partial evaluation approach [Leuschel, De Schreye, 1998]
61
Conclusion Relating integrity constraints and constraint logic programming: –Integrity constraints represented as calls to CLP constraints Strategy: lazy negation-as-failure CLP provides –incremental evaluation –self-specializing, self-simplifying code – not unlike a partial evaluation approach [Leuschel, De Schreye, 1998] To do next: consider update by deletion –in present model must be described by deleted_ facts include negation to object language –we expect: possible, but with the ”usual” complexity try out suggested ”efficient implementations”
62
Final remark CLP highly suited for evaluation of ICs ^ and modeling!
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.