package edu.stanford.nlp.sempre; import fig.basic.LispTree; /** * Just returns a fixed logical formula. * * @author Percy Liang */ public class ConstantFn extends SemanticFn { Formula formula; // Formula to return SemType type; public ConstantFn() { } public ConstantFn(Formula formula) { init(LispTree.proto.newList("ConstantFn", formula.toLispTree())); } public void init(LispTree tree) { super.init(tree); this.formula = Formulas.fromLispTree(tree.child(1)); if (2 < tree.children.size()) this.type = SemType.fromLispTree(tree.child(2)); else { this.type = TypeInference.inferType(formula); } if (!this.type.isValid()) throw new RuntimeException("ConstantFn: " + formula + " does not type check"); } public DerivationStream call(final Example ex, final Callable c) { return new SingleDerivationStream() { @Override public Derivation createDerivation() { Derivation res = new Derivation.Builder() .withCallable(c) .formula(formula) .type(type) .createDerivation(); // don't generate feature if it is not grounded to a string if (FeatureExtractor.containsDomain("constant") && c.getStart() != -1) res.addFeature("constant", ex.phraseString(c.getStart(), c.getEnd()) + " --- " + formula.toString()); return res; } }; } }