78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								/*  $Id$
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Part of CHR (Constraint Handling Rules)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Author:        Tom Schrijvers
							 | 
						||
| 
								 | 
							
								    E-mail:        Tom.Schrijvers@cs.kuleuven.be
							 | 
						||
| 
								 | 
							
								    WWW:           http://www.swi-prolog.org
							 | 
						||
| 
								 | 
							
								    Copyright (C): 2003-2004, K.U. Leuven
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is free software; you can redistribute it and/or
							 | 
						||
| 
								 | 
							
								    modify it under the terms of the GNU General Public License
							 | 
						||
| 
								 | 
							
								    as published by the Free Software Foundation; either version 2
							 | 
						||
| 
								 | 
							
								    of the License, or (at your option) any later version.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								    GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    You should have received a copy of the GNU Lesser General Public
							 | 
						||
| 
								 | 
							
								    License along with this library; if not, write to the Free Software
							 | 
						||
| 
								 | 
							
								    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    As a special exception, if you link this library with other files,
							 | 
						||
| 
								 | 
							
								    compiled with a Free Software compiler, to produce an executable, this
							 | 
						||
| 
								 | 
							
								    library does not by itself cause the resulting executable to be covered
							 | 
						||
| 
								 | 
							
								    by the GNU General Public License. This exception does not however
							 | 
						||
| 
								 | 
							
								    invalidate any other reasons why the executable file might be covered by
							 | 
						||
| 
								 | 
							
								    the GNU General Public License.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- module(a_star,
							 | 
						||
| 
								 | 
							
									[
							 | 
						||
| 
								 | 
							
										a_star/4
							 | 
						||
| 
								 | 
							
									]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(binomialheap).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(find).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(library(dialect/hprolog)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								a_star(DataIn,FinalData,ExpandData,DataOut) :-
							 | 
						||
| 
								 | 
							
									a_star_node(DataIn,0,InitialNode),
							 | 
						||
| 
								 | 
							
									empty_q(NewQueue),
							 | 
						||
| 
								 | 
							
									insert_q(NewQueue,InitialNode,Queue),
							 | 
						||
| 
								 | 
							
									a_star_aux(Queue,FinalData,ExpandData,EndNode),
							 | 
						||
| 
								 | 
							
									a_star_node(DataOut,_,EndNode).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								a_star_aux(Queue,FinalData,ExpandData,EndNode) :-
							 | 
						||
| 
								 | 
							
									delete_min_q(Queue,Queue1,Node),
							 | 
						||
| 
								 | 
							
									( final_node(FinalData,Node) ->
							 | 
						||
| 
								 | 
							
										Node = EndNode
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										expand_node(ExpandData,Node,Nodes),
							 | 
						||
| 
								 | 
							
										insert_list_q(Nodes,Queue1,NQueue),
							 | 
						||
| 
								 | 
							
										a_star_aux(NQueue,FinalData,ExpandData,EndNode)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								final_node(D^Call,Node) :-
							 | 
						||
| 
								 | 
							
									a_star_node(Data,_,Node),
							 | 
						||
| 
								 | 
							
									term_variables(Call,Vars),
							 | 
						||
| 
								 | 
							
									chr_delete(Vars,D,DVars),
							 | 
						||
| 
								 | 
							
									copy_term(D^Call-DVars,Data^NCall-DVars),
							 | 
						||
| 
								 | 
							
									call(NCall).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								expand_node(D^Ds^C^Call,Node,Nodes) :-
							 | 
						||
| 
								 | 
							
									a_star_node(Data,Score,Node),
							 | 
						||
| 
								 | 
							
									term_variables(Call,Vars),
							 | 
						||
| 
								 | 
							
									chr_delete(Vars,D,DVars0),
							 | 
						||
| 
								 | 
							
									chr_delete(DVars0,Ds,DVars1),
							 | 
						||
| 
								 | 
							
									chr_delete(DVars1,C,DVars),
							 | 
						||
| 
								 | 
							
									copy_term(D^Ds^C^Call-DVars,Data^EData^Cost^NCall-DVars),
							 | 
						||
| 
								 | 
							
									term_variables(Node,NVars,DVars),
							 | 
						||
| 
								 | 
							
									find_with_var_identity(ENode,NVars,(NCall,EScore is Cost + Score,a_star:a_star_node(EData,EScore,ENode)),Nodes).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								a_star_node(Data,Score,Data-Score).
							 |