[bp-users]Finite Domains?
Douglas R. Miles
dmiles@teknowledge.com
Sat, 15 Dec 2001 20:23:03 -0800
Hi,
I wrote small example program:
% Data Instances of class sets
isa(joe,guy).
isa(jane,woman).
isa(don,donkey).
isa(buffy,poodle).
isa(buffy,female).
isa(peter,chiauwa).
isa(peter,male).
isa(fluffy,dog).
isa(fluffy,female).
isa(A,Class):-
isa(A,M),
subclass(M,Class).
% Data Ontology of Classes
subclass(poodle,dog).
subclass(chiauwa,dog).
subclass(guy,male).
subclass(guy,human).
subclass(woman,human).
subclass(woman,female).
subclass(X,X).
subclass(X,Z):-
subclass(X,Y),
subclass(Y,Z).
% Data Predicate Arties
arity(human_couple,2).
arity(canine_couple,2).
% Data Predicate Argument Constraints
domain_constraint(human_couple,1,male)
domain_constraint(human_couple,2,female)
domain_constraint(human_couple,_,human)
domain_constraint(canine_couple,1,male)
domain_constraint(canine_couple,2,female)
domain_constraint(canine_couple,_,dog)
% Program
solve(G):-
arity(F,N),
functor(G,F,N),
G=..[F|Args],
instance_args(1,F,Args).
instance_args(_N,_F,[]).
instance_args(N,F,[A|Rgs]):-
findall(Class,domain_constraint(F,N,Class),Classes),
can_will_be_instance(A,Classes),
NN is N + 1,
instance_args(NN,F,Rgs).
can_will_be_instance(A,[]).
can_will_be_instance(A,[Class|Classes]):-
isa(A,Class),
can_will_be_instance(A,Classes).
I would like to see how the example could be modified
in ways that take advantage of B-Prolog features.
Here is the desired output:
?- solve(human_couple(joe,fluffy)).
No.
?- solve(canine_couple(X,Y)).
X = peter
Y = buffy ;
X = peter
Y = fluffy ;
No.
?- solve(G).
G = human_couple(joe,jane) ;
G = canine_couple(peter,buffy) ;
G = canine_couple(peter,fluffy) ;
No.
Thank you,
Douglas