Extending Prolog with Modularity, Concurrency and Meta-Rules