All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.thesett.aima.logic.fol.prolog.builtins.BuiltInTransform Maven / Gradle / Ivy

Go to download

Implementation of a Prolog interpreter that works directly over the abstract syntax tree.

There is a newer version: 0.9.117
Show newest version
/*
 * Copyright The Sett Ltd, 2005 to 2014.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.thesett.aima.logic.fol.prolog.builtins;

import java.util.HashMap;
import java.util.Map;

import com.thesett.aima.logic.fol.Functor;
import com.thesett.aima.logic.fol.FunctorName;
import com.thesett.aima.logic.fol.VariableAndFunctorInterner;
import com.thesett.common.util.Function;
import com.thesett.common.util.ReflectionUtils;

/**
 * BuiltInTransform implements a compilation transformation over term syntax trees, that substitutes for functors that
 * map onto Prolog built-ins, an extension of the functor type that implements the built-in.
 *
 * 

*
CRC Card
Responsibilities Collaborations *
Transform functors to built in functors where appropriate. * {@link BuiltInFunctor}, {@link VariableAndFunctorInterner}. *
* * @author Rupert Smith */ public class BuiltInTransform implements Function { /** Holds a mapping from functor names to built-in implementations. */ private final Map> builtIns = new HashMap>(); /** Used to extract functor names to match. */ private final VariableAndFunctorInterner interner; /** * Initializes the built-in transformation by population the the table of mappings of functors onto their built-in * implementations. * * @param interner The interner to use to extract functor names to match as built-ins. */ public BuiltInTransform(VariableAndFunctorInterner interner) { this.interner = interner; builtIns.put(new FunctorName("true", 0), True.class); builtIns.put(new FunctorName("fail", 0), Fail.class); builtIns.put(new FunctorName("!", 0), Cut.class); builtIns.put(new FunctorName("=", 2), Unifies.class); builtIns.put(new FunctorName("\\=", 2), NonUnifies.class); builtIns.put(new FunctorName("is", 2), Is.class); builtIns.put(new FunctorName(";", 2), Disjunction.class); builtIns.put(new FunctorName("call", 1), Call.class); builtIns.put(new FunctorName(">", 2), GreaterThan.class); builtIns.put(new FunctorName(">=", 2), GreaterThanOrEqual.class); builtIns.put(new FunctorName("<", 2), LessThan.class); builtIns.put(new FunctorName("=<", 2), LessThanOrEqual.class); builtIns.put(new FunctorName("integer", 1), IntegerCheck.class); builtIns.put(new FunctorName("float", 1), FloatCheck.class); } /** * Applies a built-in replacement transformation to functors. If the functor matches built-in, a * {@link BuiltInFunctor} is created with a mapping to the functors built-in implementation, and the functors * arguments are copied into this new functor. If the functor does not match a built-in, it is returned unmodified. * * @param functor The functor to attempt to map onto a built-in. * * @return The functor umodified, or a {@link BuiltInFunctor} replacement for it. */ public BuiltInFunctor apply(Functor functor) { FunctorName functorName = interner.getFunctorFunctorName(functor); Class builtInClass; if (builtIns.containsKey(functorName)) { builtInClass = builtIns.get(functorName); } else { builtInClass = DefaultBuiltIn.class; } return ReflectionUtils.newInstance(ReflectionUtils.getConstructor(builtInClass, new Class[] { Functor.class }), new Object[] { functor }); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy