[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