275 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			275 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | % Terminological Reasoning (similar to KL-ONE or feature trees) | ||
|  | % Ph. Hanschke, DFKI Kaiserslautern, and Th. Fruehwirth | ||
|  | % 920120-920217-920413-920608ff-931210, LMU 980312 | ||
|  | 
 | ||
|  | :- use_module( library(chr)). | ||
|  | 
 | ||
|  | handler klone. | ||
|  | 
 | ||
|  | 
 | ||
|  | % SYNTAX | ||
|  | 
 | ||
|  | % Basic operators | ||
|  | operator(1200,xfx,isa).	% concept definition | ||
|  | operator(950,xfx,'::').	% A-Box membership and role-filler assertion | ||
|  | operator(940,xfy,or).	% disjunction | ||
|  | operator(930,xfy,and).	% conjunction | ||
|  | operator(700,xfx,is).	% used in restricitions  | ||
|  | operator(690,fy, nota). % complement 		 | ||
|  | operator(650,fx, some).	% exists-in restriction | ||
|  | operator(650,fx, every). % value restriction | ||
|  | % Operators for extensions | ||
|  | operator(100,fx, feature). % functional role / attribute | ||
|  | operator(100,fx, distinct). % concept distinct from any other concept | ||
|  | operator(100,fx, at_most_one). % local functional role | ||
|  | operator(100,yfx,of).	% role chain  (note associativity) | ||
|  | 
 | ||
|  | :- dynamic (feature)/1, (distinct)/1, (isa)/2.  % to allow scattered clauses | ||
|  | 
 | ||
|  | 
 | ||
|  | % TYPES | ||
|  | 
 | ||
|  | role_assertion((I,J)::R):- individual(I),individual(J), role(R). | ||
|  | membership_assertion(I::T):- individual(I), concept_term(T). | ||
|  | 
 | ||
|  | concept_definition((C isa T)):- concept(C), concept_term(T). | ||
|  | 
 | ||
|  | concept_term(S):- concept(S). | ||
|  | concept_term(S or T):- concept_term(S), concept_term(T). | ||
|  | concept_term(S and T):- concept_term(S), concept_term(T). | ||
|  | concept_term(nota S):- concept_term(S). | ||
|  | concept_term(some R is S):- role(R), concept_term(S). | ||
|  | concept_term(every R is S):- role(R), concept_term(S). | ||
|  | concept_term(at_most_one R):- role(R).	% extension | ||
|  | 
 | ||
|  | individual(I):- var(I) ; atomic(I). | ||
|  | 
 | ||
|  | role(R):- atom(R). | ||
|  | role(R1 of R2):- role(R1), role(R2).	% extension | ||
|  | 
 | ||
|  | concept(C):- atom(C). | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | % CONSISTENCY CHECK | ||
|  | % A-box as constraint goals, T-box asserted (concept definitions by isa-rules) | ||
|  | 
 | ||
|  | constraints (::)/2, labeling/0. | ||
|  | 
 | ||
|  | % disjunction (is delayed as choice) | ||
|  | labeling, (I::S or T) # Ph <=> | ||
|  | 	(I::S ; I::T), | ||
|  | 	labeling | ||
|  |     pragma passive(Ph). | ||
|  | 
 | ||
|  | % primitive clash | ||
|  |   I::nota Q, I::Q <=> fail.		 | ||
|  | 
 | ||
|  | % duplicates | ||
|  |   I::C \ I::C <=> true. | ||
|  | 
 | ||
|  | % top | ||
|  |   I::top <=> true. | ||
|  | 
 | ||
|  | % complement nota/1 | ||
|  | 
 | ||
|  | % nota-top | ||
|  |   I::nota top <=> fail. | ||
|  | 
 | ||
|  | % nota-or | ||
|  |   I::nota (S or T) <=> I::(nota S and nota T). | ||
|  | 
 | ||
|  | % nota-and | ||
|  |   I::nota (S and T) <=> I::(nota S or nota T). | ||
|  | 
 | ||
|  | % nota-nota | ||
|  |   I::nota nota S <=> I::S. | ||
|  | 
 | ||
|  | % nota-every  | ||
|  |   I::nota every R is S <=> I::some R is nota S. | ||
|  | 
 | ||
|  | % nota-some  | ||
|  |   I::nota some R is S <=> I::every R is nota S. | ||
|  | 
 | ||
|  | % conjunction | ||
|  |   I::S and T <=> I::S, I::T. | ||
|  | 
 | ||
|  | % exists-in restriction | ||
|  |   I::some R is S <=> role(R) | (I,J)::R, J::S.	% generate witness | ||
|  | 
 | ||
|  | % value restriction | ||
|  |   I::every R is S, (I,J)::R ==> J::S. | ||
|  | 
 | ||
|  | % Extensions ------------------------------------------------------------------ | ||
|  | 
 | ||
|  | % value restriction merge and consistency test | ||
|  |   I::every R is S1, I::every R is S2 <=> I::every R is S1 and S2, J::S1 and S2. | ||
|  | 
 | ||
|  | % distinct/disjoint concept | ||
|  |   I::C1 \ I::C2 <=> concept(C1),concept(C2),distinct C1 | C1=C2. | ||
|  | 
 | ||
|  | % features/attributes/functional role | ||
|  |   (I,J1)::F \ (I,J2)::F <=> feature F | J1=J2.  | ||
|  | 
 | ||
|  | % role chains | ||
|  |   (I,J)::C1 of C2 <=> (I,K)::C2, (K,J)::C1.	% also covers "some" case | ||
|  |   I::every R1 of R is S, (I,J)::R ==> J::every R1 is S. | ||
|  |   I::at_most_one R1 of R, (I,J)::R ==> J::at_most_one R1. | ||
|  | 
 | ||
|  | % simple number restriction / local functional role using role chains | ||
|  | constraints at_most_one/3. | ||
|  |   I::at_most_one R, (I,J)::R ==> at_most_one(I,J,R). | ||
|  |   at_most_one(I,J,R) \ at_most_one(I,J1,R) <=> J1=J. | ||
|  | 
 | ||
|  |   I::nota at_most_one R <=> (I,J1)::R, (I,J2)::R, (J1,J2)::different. | ||
|  | 
 | ||
|  | % concrete domain predicates | ||
|  |   (X,X)::different <=> fail. | ||
|  |   (X,Y)::identical <=> X=Y. | ||
|  | 
 | ||
|  |   X::greater(Y) <=>  ground(X) | X>Y. | ||
|  |   (X,Y)::greater <=> ground(X), ground(Y) | X>Y. | ||
|  |   X::smaller(Y) <=>  ground(X) | X<Y. | ||
|  |   (X,Y)::smaller <=> ground(X), ground(Y) | X<Y. | ||
|  | 
 | ||
|  | % binary concrete domain predicates using role chains | ||
|  |   I::some (R1 and R2) is S <=> (I,J1)::R1, (I,J2)::R2, (J1,J2)::S. | ||
|  | constraints (every)/3. | ||
|  |   I::every (R1 and R2) is S <=> every((I,I),(R1,R2),S). | ||
|  |   every((I1,I2),(identical,identical),S) <=> (I1,I2)::S. | ||
|  |   every((I1,I2),(identical,R),S), (I2,J2)::R ==>  | ||
|  | 	(I1,J2)::S. | ||
|  |   every((I1,I2),(identical,R2 of R),S), (I2,J2)::R ==>  | ||
|  | 	every((I1,J2),(identical,R2),S). | ||
|  |   every((I1,I2),(R,R2),S), (I1,J1)::R ==>  | ||
|  | 	every((J1,I2),(identical,R2),S). | ||
|  |   every((I1,I2),(R1 of R,R2),S), (I1,J1)::R ==>  | ||
|  | 	every((J1,I2),(R1,R2),S). | ||
|  | 
 | ||
|  | 
 | ||
|  | % unfolding using concept definition | ||
|  | %    if you use recursion in concepts, replace rules below by propagation rules | ||
|  |   I::C <=> (C isa T) | I::T. | ||
|  |   I::nota C <=> (C isa T) | I::nota T. | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | % EXAMPLES =================================================================== | ||
|  | 
 | ||
|  | 
 | ||
|  | % Family --------------------------------------------------------------------- | ||
|  | 
 | ||
|  | female isa nota male. | ||
|  | woman isa human and female. | ||
|  | man isa human and male. | ||
|  | parent isa human and some child is human. | ||
|  | father isa parent and man. | ||
|  | mother isa parent and woman. | ||
|  | grandfather isa father and some child is parent. | ||
|  | grandmother isa mother and some child is parent. | ||
|  | fatherofsons isa father and every child is male. | ||
|  | 
 | ||
|  | feature age.  | ||
|  | person isa (man or woman) and every age is number. | ||
|  | 
 | ||
|  | distinct number. | ||
|  | X::number <=> nonvar(X) | number(X). | ||
|  | 
 | ||
|  | feature partner. | ||
|  | married_person isa person and every partner is married_person. % recursion ! | ||
|  | 
 | ||
|  | 
 | ||
|  | % Configuration --------------------------------------------------------------- | ||
|  | 
 | ||
|  | distinct interface. | ||
|  | distinct configuration. | ||
|  | 
 | ||
|  | simple_device isa device and  | ||
|  | 	some connector is interface. | ||
|  | 
 | ||
|  | feature component_1. | ||
|  | feature component_2. | ||
|  | 
 | ||
|  | simple_config isa configuration and | ||
|  | 	some component_1 is simple_device and	 | ||
|  | 	some component_2 is simple_device. | ||
|  | 
 | ||
|  | very_simple_device isa simple_device and  | ||
|  | 	at_most_one connector. | ||
|  | 
 | ||
|  |   feature price. | ||
|  |   feature voltage. | ||
|  |   feature frequency. | ||
|  | 
 | ||
|  |   electrical_device isa very_simple_device and | ||
|  |       	some voltage is greater(0) and some price is greater(1). | ||
|  | 
 | ||
|  |   low_cost_device isa electrical_device and  | ||
|  | 	every price is smaller(200).   | ||
|  | 
 | ||
|  |   high_voltage_device isa electrical_device and  | ||
|  | 	every voltage is greater(15). | ||
|  | 
 | ||
|  |   electrical_config isa simple_configuration and | ||
|  |       	every component_1 is electrical_device and | ||
|  |       	every component_2 is electrical_device and | ||
|  |       	every (voltage of component_1 and voltage of component_2)  | ||
|  | 		is greater. | ||
|  | 
 | ||
|  |   bus_device isa simple_device and bus and  | ||
|  | 	some frequency is greater(0).   | ||
|  |   cpu_device isa simple_device and cpu and  | ||
|  | 	some frequency is greater(0).   | ||
|  | 
 | ||
|  |   bus_config isa configuration and | ||
|  |       	some main_device is bus_device and | ||
|  |       	every component is cpu_device and | ||
|  |       	every (frequency of main_device and frequency of sub_device) | ||
|  | 		is greater. | ||
|  | 
 | ||
|  | 
 | ||
|  |   catalog(dev1) :- dev1::electrical_device, | ||
|  |       	(dev1,10)::voltage, (dev1,100)::price. | ||
|  |   catalog(dev2) :- dev2::electrical_device, | ||
|  |       	(dev2,20)::voltage, (dev2,1000)::price. | ||
|  | 
 | ||
|  |   possible_config(C) :-  | ||
|  |       	catalog(D1), (C,D1)::component_1, | ||
|  |       	catalog(D2), (C,D2)::component_2. | ||
|  | 
 | ||
|  | /* | ||
|  | % Example Queries | ||
|  | 
 | ||
|  |   :- possible_config(C). | ||
|  | 
 | ||
|  |   :- possible_config(C), C::electrical_config. | ||
|  | 
 | ||
|  |   :- possible_config(C), C::electrical_config, | ||
|  |       	(C,D1)::component_1, D1::low_cost_device, | ||
|  |       	(C,D2)::component_2, D2::high_voltage_device. | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | % Prolog terms --------------------------------------------------------- | ||
|  | % see also handler term.chr | ||
|  | 
 | ||
|  | feature functor. | ||
|  | feature arity. | ||
|  | feature arg(N). | ||
|  | 
 | ||
|  | term isa top and some arity is number and some arity is greater(-1) | ||
|  | 	     and some functor is top. | ||
|  | 
 | ||
|  | (X,_)::arg(N) ==> N>=1. | ||
|  | %(X,A)::arity ==> A>=0. | ||
|  | (X,A)::arity,(X,_)::arg(N) ==> A>=N,A>=1. | ||
|  | 
 | ||
|  | % (X,0)::arity <-> (X,X)::functor | ||
|  | (X,0)::arity ==> (X,X)::functor. | ||
|  | (X,X)::functor ==> (X,0)::arity. | ||
|  | 
 | ||
|  | 
 | ||
|  | % end of kl-one.pl ======================================================== |