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.
							 |