:- dynamic pl/1. pl :- ( current_op( 900, fy, nospy) -> % sicstus (3.8.6) retractall( pl(_OldP) ), prolog_flag(version,SicsVer), ensure_loaded( library(lists) ), atom_codes( SicsVer, SicsVerCs ), append( "SICStus ", SicsVerNoCs, SicsVerCs ), append( SicsVerMjCs, [0'.|SicsVerMnFxCs], SicsVerNoCs ), append( SicsVerMnCs, [0'.|SicsVerFxRsCs], SicsVerMnFxCs ), append( SicsVerFxCs, [0' |_SicsVerRsCs], SicsVerFxRsCs ), number_codes( Mj, SicsVerMjCs ), number_codes( Mn, SicsVerMnCs ), number_codes( Fx, SicsVerFxCs ), assert( pl(sicstus(Mj:Mn:Fx)) ) ; ( current_op( _P, _A, '#=' ) -> % eclipse (4.2) getcwd(Cwd), assert( prolog_load_context(directory,Cwd) ), assert( wh_prolog(eclipse(ver)) ), retract_all( pl(_OldP) ), get_flag( version, Ver ), assert( pl(eclipse(Ver)) ) ; ( current_op( _P, _A, module_transparent ) -> % swi (4:0:10) current_prolog_flag( version, SwiVer ), Mj is SwiVer // 10000, Md is SwiVer mod 10000, Mn is Md // 100, Fx is Md mod 100, retractall( pl(_OldP) ), assert( pl(swi(Mj:Mn:Fx)) ) ; ( current_op(_P,_A,same) -> % yap 4.3.20 prolog_flag( version, YapVer ), ensure_loaded( library(lists) ), atom_codes( YapVer, YapVerCs ), append( "Yap-", YapVerNoCs, YapVerCs ), append( YapVerMjCs, [0'.|YapVerMnFxCs], YapVerNoCs ), append( YapVerMnCs, [0'.|YapVerFxCs], YapVerMnFxCs ), number_codes( Mj, YapVerMjCs ), number_codes( Mn, YapVerMnCs ), number_codes( Fx, YapVerFxCs ), retractall( pl(_OldP) ), assert( pl(yap(Mj:Mn:Fx)) ), ! ; true ) ) ) ). :- pl. pl_call( Prolog, Call ) :- ( pl( Prolog ) -> call( Call ) ; true ).