125 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
							 | 
						||
| 
								 | 
							
								%  clp(q,r)                                         version 1.3.3 %
							 | 
						||
| 
								 | 
							
								%                                                                 %
							 | 
						||
| 
								 | 
							
								%  (c) Copyright 1992,1993,1994,1995                              %
							 | 
						||
| 
								 | 
							
								%  Austrian Research Institute for Artificial Intelligence (OFAI) %
							 | 
						||
| 
								 | 
							
								%  Schottengasse 3                                                %
							 | 
						||
| 
								 | 
							
								%  A-1010 Vienna, Austria                                         %
							 | 
						||
| 
								 | 
							
								%                                                                 %
							 | 
						||
| 
								 | 
							
								%  File:   geler.pl                                               %
							 | 
						||
| 
								 | 
							
								%  Author: Christian Holzbaur           christian@ai.univie.ac.at %
							 | 
						||
| 
								 | 
							
								%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- module( geler_r, 
							 | 
						||
| 
								 | 
							
									[
							 | 
						||
| 
								 | 
							
									    geler/2,
							 | 
						||
| 
								 | 
							
									    project_nonlin/3,
							 | 
						||
| 
								 | 
							
									    collect_nonlin/3
							 | 
						||
| 
								 | 
							
									]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module( library(atts)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- attribute goals/1, all_nonlin/1.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								attribute_goal( X, Goals) :-
							 | 
						||
| 
								 | 
							
								  get_atts( X, goals(Gs)),
							 | 
						||
| 
								 | 
							
								  nonexhausted( Gs, Goals, []),
							 | 
						||
| 
								 | 
							
								  Goals = [_|_].
							 | 
						||
| 
								 | 
							
								attribute_goal( X, Conj) :-
							 | 
						||
| 
								 | 
							
								  get_atts( X, all_nonlin(Goals)),
							 | 
						||
| 
								 | 
							
								  l2conj( Goals, Conj).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								l2conj( [X|Xs], Conj) :-
							 | 
						||
| 
								 | 
							
								  ( Xs = [], Conj = X
							 | 
						||
| 
								 | 
							
								  ; Xs = [_|_], Conj = (X,Xc), l2conj( Xs, Xc)
							 | 
						||
| 
								 | 
							
								  ).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								nonexhausted( run(Mutex,G)) -->
							 | 
						||
| 
								 | 
							
								  ( {
							 | 
						||
| 
								 | 
							
								      var(Mutex)
							 | 
						||
| 
								 | 
							
								    } ->
							 | 
						||
| 
								 | 
							
								      [ G ]
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								      []
							 | 
						||
| 
								 | 
							
								  ).
							 | 
						||
| 
								 | 
							
								nonexhausted( (A,B)) -->
							 | 
						||
| 
								 | 
							
								  nonexhausted( A),
							 | 
						||
| 
								 | 
							
								  nonexhausted( B).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								verify_attributes( X, Y, Later) :-
							 | 
						||
| 
								 | 
							
								  get_atts( X, goals(Gx)),
							 | 
						||
| 
								 | 
							
								  !,
							 | 
						||
| 
								 | 
							
								  ( var(Y),
							 | 
						||
| 
								 | 
							
								      ( get_atts( Y, goals(Gy)) ->
							 | 
						||
| 
								 | 
							
									  Later = [Gx,Gy],
							 | 
						||
| 
								 | 
							
									  put_atts( Y, -goals(_))
							 | 
						||
| 
								 | 
							
								      ;
							 | 
						||
| 
								 | 
							
									  Later = [],
							 | 
						||
| 
								 | 
							
									  put_atts( Y, goals(Gx))
							 | 
						||
| 
								 | 
							
								      )
							 | 
						||
| 
								 | 
							
								  ; nonvar( Y),
							 | 
						||
| 
								 | 
							
								      Later = [Gx]
							 | 
						||
| 
								 | 
							
								  ).
							 | 
						||
| 
								 | 
							
								verify_attributes( _, _, []).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								project_attributes( _, Cvas) :-
							 | 
						||
| 
								 | 
							
								  collect_nonlin( Cvas, L, []),
							 | 
						||
| 
								 | 
							
								  sort( L, Ls),
							 | 
						||
| 
								 | 
							
								  put_atts( _, all_nonlin(Ls)).
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% called from project.pl
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								project_nonlin( _, Cvas, Reachable) :-
							 | 
						||
| 
								 | 
							
								  collect_nonlin( Cvas, L, []),
							 | 
						||
| 
								 | 
							
								  sort( L, Ls),
							 | 
						||
| 
								 | 
							
								  prolog:term_variables( Ls, Reachable),
							 | 
						||
| 
								 | 
							
								  put_atts( _, all_nonlin(Ls)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								collect_nonlin( []) --> [].
							 | 
						||
| 
								 | 
							
								collect_nonlin( [X|Xs]) -->
							 | 
						||
| 
								 | 
							
								  ( {get_atts( X, goals(Gx))} ->
							 | 
						||
| 
								 | 
							
								      trans( Gx),
							 | 
						||
| 
								 | 
							
								      collect_nonlin( Xs)
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								      collect_nonlin( Xs)
							 | 
						||
| 
								 | 
							
								  ).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								trans( (A,B)) -->
							 | 
						||
| 
								 | 
							
								  trans( A),
							 | 
						||
| 
								 | 
							
								  trans( B).
							 | 
						||
| 
								 | 
							
								trans( run(Mutex,Gs)) -->
							 | 
						||
| 
								 | 
							
								  ( {var(Mutex)} ->
							 | 
						||
| 
								 | 
							
								       {Mutex = done},
							 | 
						||
| 
								 | 
							
								       transg( Gs)
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								       []
							 | 
						||
| 
								 | 
							
								  ).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								transg( (A,B)) --> !,
							 | 
						||
| 
								 | 
							
								  transg( A),
							 | 
						||
| 
								 | 
							
								  transg( B).
							 | 
						||
| 
								 | 
							
								transg( M:G) --> !,
							 | 
						||
| 
								 | 
							
								  M:transg( G).
							 | 
						||
| 
								 | 
							
								transg( G) --> [ G ].
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								run( Mutex, _) :- nonvar(Mutex).
							 | 
						||
| 
								 | 
							
								run( Mutex, G) :- var(Mutex), Mutex=done, call( G).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- meta_predicate geler(+,:).
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								geler( Vars, Goal) :-
							 | 
						||
| 
								 | 
							
								  attach( Vars, run(_Mutex,Goal)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								attach( [], _).
							 | 
						||
| 
								 | 
							
								attach( [V|Vs], Goal) :-
							 | 
						||
| 
								 | 
							
								  ( var(V), get_atts( V, goals(Gv)) ->
							 | 
						||
| 
								 | 
							
								      put_atts( V, goals((Goal,Gv)))
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								      put_atts( V, goals(Goal))
							 | 
						||
| 
								 | 
							
								  ),
							 | 
						||
| 
								 | 
							
								  attach( Vs, Goal).
							 |