73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | :- object(fault, | ||
|  | 	imports(proto_hierarchy)). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	:- info([ | ||
|  | 		authors 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. | ||
|  | 
 | ||
|  | 	exhibited(Symptom) :- | ||
|  | 		::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. |