179 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | :- object(fault, | ||
|  | 	imports(proto_hierarchy)). | ||
|  | 
 | ||
|  | 	:- info([ | ||
|  | 		author is 'Paulo Moura', | ||
|  | 		version is 1.0, | ||
|  | 		date is 2000/4/22, | ||
|  | 		comment is 'Expert system for automobile fault diagnosis.', | ||
|  | 		source is 'Example adopted from the LPA Prolog++ documentation.']). | ||
|  | 
 | ||
|  | 	:- public(findall/0). | ||
|  | 	:- mode(findall, one). | ||
|  | 
 | ||
|  | 	:- private(told_by_user_/2). | ||
|  | 	:- dynamic(told_by_user_/2). | ||
|  | 	:- mode(told_by_user_(?nonvar, ?nonvar), zero_or_more). | ||
|  | 
 | ||
|  | 	:- public(find/1). | ||
|  | 	:- mode(find(?nonvar), zero_or_more). | ||
|  | 
 | ||
|  | 	:- private(exhibited/1). | ||
|  | 	:- mode(exhibited(+nonvar), zero_or_one). | ||
|  | 
 | ||
|  | 	:- public(contrary/2). | ||
|  | 	:- mode(contrary(?nonvar, ?nonvar), zero_or_more). | ||
|  | 
 | ||
|  | 	:- public(fault/2). | ||
|  | 	:- mode(fault(?nonvar, ?nonvar), zero_or_more). | ||
|  | 
 | ||
|  | 	:- public(effect/2). | ||
|  | 	:- mode(effect(?nonvar, ?nonvar), zero_or_more). | ||
|  | 
 | ||
|  | 	:- public(symptom/2). | ||
|  | 	:- mode(symptom(?nonvar, ?nonvar), zero_or_more). | ||
|  | 
 | ||
|  | 	findall :- | ||
|  | 		retractall(told_by_user_(_, _)), | ||
|  | 		write('Please answer all questions with yes or no.'), nl, nl, | ||
|  | 		forall( | ||
|  |  			(::descendant(Where), Where::find(Description)), | ||
|  | 			(nl, write('Location      : '), write(Where), nl, | ||
|  | 			 write('Possible Fault: '), write(Description), nl)), | ||
|  | 		nl, write('No (more) explanations found.'). | ||
|  | 
 | ||
|  | 	find(Description) :- | ||
|  | 		::fault(Fault, Description), | ||
|  | 		forall(::effect(Fault, Symptom), exhibited(Symptom)). | ||
|  | 
 | ||
|  | 	exhibited(Symptom) :- | ||
|  | 		told_by_user_(Symptom, Reply) -> | ||
|  | 			Reply = yes | ||
|  | 			; | ||
|  | 			::symptom(Symptom, Description), | ||
|  | 			write(Description), write('? '), | ||
|  | 			read(Reply), | ||
|  | 			asserta(told_by_user_(Symptom, Reply)), | ||
|  | 			Reply = yes, | ||
|  | 			forall( | ||
|  | 				(::contrary(Symptom, Contrary); ::contrary(Contrary, Symptom)), | ||
|  | 				asserta(told_by_user_(Contrary, no))). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* electrical sub-system: | ||
|  | 
 | ||
|  | 	electrical | ||
|  | 		lights | ||
|  | 		starting | ||
|  | 			sparking | ||
|  | 				distributor | ||
|  | 				plugs | ||
|  | 			starter_motor | ||
|  | 
 | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(electrical, | ||
|  | 	extends(fault)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(lights, | ||
|  | 	extends(electrical)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(starting, | ||
|  | 	extends(electrical)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(sparking, | ||
|  | 	extends(starting)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(distributor, | ||
|  | 	extends(sparking)). | ||
|  | 
 | ||
|  | 	fault(f1001, 'Condensation in the distributor cap'). | ||
|  | 	fault(f1002, 'Faulty distributor arm'). | ||
|  | 	fault(f1003, 'Worn distributor brushes'). | ||
|  | 
 | ||
|  | 	symptom(s1001, 'The starter turns but the engine doesnt fire'). | ||
|  | 	symptom(s1002, 'The engine has difficulty starting'). | ||
|  | 	symptom(s1003, 'The engine cuts out shortly after starting'). | ||
|  | 	symptom(s1004, 'The engine cuts out at speed'). | ||
|  | 
 | ||
|  | 	effect(f1001, s1001). | ||
|  | 	effect(f1002, s1001). | ||
|  | 	effect(f1002, s1004). | ||
|  | 	effect(f1003, s1002). | ||
|  | 	effect(f1003, s1003). | ||
|  | 
 | ||
|  | 	contrary(s1002, s1001). | ||
|  | 	contrary(s1003, s1001). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(plugs, | ||
|  | 	extends(sparking)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(starter_motor, | ||
|  | 	extends(starting)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* mechanical sub-system: | ||
|  | 
 | ||
|  | 	mechanical | ||
|  | 		engine | ||
|  | 			cylinders | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(mechanical, | ||
|  | 	extends(fault)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(engine, | ||
|  | 	extends(mechanical)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(cylinders, | ||
|  | 	extends(engine)). | ||
|  | 
 | ||
|  | :- end_object. | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* fuel_system sub-system: | ||
|  | 
 | ||
|  | 	fuel_system | ||
|  | 		... | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | :- object(fuel_system, | ||
|  | 	extends(fault)). | ||
|  | 
 | ||
|  | :- end_object. |