Logic programming with function symbols: Checking termination of bottom-up evaluation through program adornments