DSL by prolog