71 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- category(bounded_coordinate).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- info([
							 | 
						||
| 
								 | 
							
										version is 1.0,
							 | 
						||
| 
								 | 
							
										date is 1998/3/23,
							 | 
						||
| 
								 | 
							
										authors is 'Paulo Moura',
							 | 
						||
| 
								 | 
							
										comment is 'Point coordinate bounds management predicates.',
							 | 
						||
| 
								 | 
							
										source is 'Example adopted from the SICStus Objects documentation.']).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(set_bounds/3).
							 | 
						||
| 
								 | 
							
									:- mode(set_bounds(+atom, +integer, +integer), one).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(clear_bounds/1).
							 | 
						||
| 
								 | 
							
									:- mode(clear_bounds(+atom), one).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(bounds/3).
							 | 
						||
| 
								 | 
							
									:- mode(bounds(?atom, ?integer, ?integer), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(check_bounds/2).
							 | 
						||
| 
								 | 
							
									:- mode(check_bounds(+atom, +integer), zero_or_one).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(print_bounds/1).
							 | 
						||
| 
								 | 
							
									:- mode(print_bounds(?atom), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(valid_value/2).
							 | 
						||
| 
								 | 
							
									:- mode(valid_value(+atom, +integer), zero_or_one).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- private(bounds_/3).
							 | 
						||
| 
								 | 
							
									:- dynamic(bounds_/3).
							 | 
						||
| 
								 | 
							
									:- mode(bounds_(?atom, ?integer, ?integer), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									set_bounds(Coordinate, Min, Max) :-
							 | 
						||
| 
								 | 
							
										::retractall(bounds_(Coordinate, _, _)),
							 | 
						||
| 
								 | 
							
										::assertz(bounds_(Coordinate, Min, Max)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									clear_bounds(Coordinate) :-
							 | 
						||
| 
								 | 
							
										::retractall(bounds_(Coordinate, _, _)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bounds(Coordinate, Min, Max) :-
							 | 
						||
| 
								 | 
							
										::bounds_(Coordinate, Min, Max).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									check_bounds(Coordinate, Value) :-
							 | 
						||
| 
								 | 
							
										::bounds_(Coordinate, Min, Max),
							 | 
						||
| 
								 | 
							
										Value >= Min,
							 | 
						||
| 
								 | 
							
										Value =< Max.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									print_bounds(Coordinate) :-
							 | 
						||
| 
								 | 
							
										::bounds_(Coordinate, Min, Max),
							 | 
						||
| 
								 | 
							
										writeq(bounds(Coordinate)),
							 | 
						||
| 
								 | 
							
										write(' : '),
							 | 
						||
| 
								 | 
							
										write((Min, Max)),
							 | 
						||
| 
								 | 
							
										nl.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									valid_value(Coordinate, Value) :-
							 | 
						||
| 
								 | 
							
										::bounds_(Coordinate, Min, Max) ->
							 | 
						||
| 
								 | 
							
											Value >= Min, Value =< Max
							 | 
						||
| 
								 | 
							
											;
							 | 
						||
| 
								 | 
							
											true.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_category.
							 |