/*
* Copyright 2014 Igor Maznitsa (http://www.igormaznitsa.com).
*
* 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.igormaznitsa.prol.libraries;
import com.igormaznitsa.prol.annotations.Determined;
import com.igormaznitsa.prol.annotations.Predicate;
import com.igormaznitsa.prol.data.Term;
import com.igormaznitsa.prol.data.TermFloat;
import com.igormaznitsa.prol.data.TermInteger;
import com.igormaznitsa.prol.data.TermStruct;
import com.igormaznitsa.prol.logic.Goal;
import com.igormaznitsa.prol.utils.Utils;
/**
* The class implements the Prol String library allows to manipulate with
* strings
*
* @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)
*/
public class ProlStringLibrary extends ProlAbstractLibrary {
@Predicate(Signature = "concat/3", Template = {"+atom,+atom,?atom", "+atom,?atom,+atom", "?atom,+atom,+atom"}, Reference = "Concat two strings.")
@Determined
public static final boolean predicateCONCAT(final Goal goal, final TermStruct predicate) {
final Term argFIRST = Utils.getTermFromElement(predicate.getElement(0));
final Term argSECOND = Utils.getTermFromElement(predicate.getElement(1));
final Term argTHIRD = Utils.getTermFromElement(predicate.getElement(2));
if (argFIRST.getTermType() == Term.TYPE_ATOM) {
if (argSECOND.getTermType() == Term.TYPE_ATOM) {
// the first case
StringBuilder bldr = new StringBuilder(argFIRST.getText());
bldr.append(argSECOND.getText());
Term term = new Term(bldr.toString());
return argTHIRD.Equ(term);
}
else {
// the second case
String startText = argFIRST.getText();
String fullText = argTHIRD.getText();
if (startText.length() > fullText.length()) {
return false;
}
String endText = fullText.substring(startText.length());
Term second = new Term(endText);
return argSECOND.Equ(second);
}
}
else {
// the third case
String endText = argSECOND.getText();
String fullText = argTHIRD.getText();
if (endText.length() > fullText.length()) {
return false;
}
String startText = fullText.substring(0, fullText.length() - endText.length());
Term first = new Term(startText);
return argFIRST.Equ(first);
}
}
@Predicate(Signature = "str_trim/2", Template = {"+atom,?atom"}, Reference = "Trim string.")
@Determined
public static final boolean predicateSTRTRIM(final Goal goal, final TermStruct predicate) {
final Term argLeft = Utils.getTermFromElement(predicate.getElement(0));
final Term argRight = Utils.getTermFromElement(predicate.getElement(1));
Term result = new Term(argLeft.getText().trim());
return argRight.Equ(result);
}
@Predicate(Signature = "upper_lower/2", Template = {"+atom,?atom", "?atom,+atom"}, Reference = "Allows to make upper or lower case text version of an atom.")
@Determined
public static final boolean predicateUPPERLOWER(final Goal goal, final TermStruct predicate) {
final Term argLeft = Utils.getTermFromElement(predicate.getElement(0));
final Term argRight = Utils.getTermFromElement(predicate.getElement(1));
if (argLeft.getTermType() == Term.TYPE_ATOM) {
// the first case
Term term = new Term(argLeft.getText().toLowerCase());
return argRight.Equ(term);
}
else {
// the second case
Term term = new Term(argRight.getText().toUpperCase());
return argLeft.Equ(term);
}
}
@Predicate(Signature = "str_len/2", Template = {"+atom,?integer"}, Reference = "Get string length.")
@Determined
public static final boolean predicateSTRLEN(final Goal goal, final TermStruct predicate) {
final Term argLeft = Utils.getTermFromElement(predicate.getElement(0));
final Term argRight = Utils.getTermFromElement(predicate.getElement(1));
TermInteger result = new TermInteger(argLeft.getText().length());
return argRight.Equ(result);
}
@Predicate(Signature = "str_int/2", Template = {"+atom,?integer", "?atom,+integer"}, Reference = "Convert a text atom to an integer atom (or back).")
@Determined
public static final boolean predicateSTRINT(final Goal goal, final TermStruct predicate) {
final Term argLeft = Utils.getTermFromElement(predicate.getElement(0));
final Term argRight = Utils.getTermFromElement(predicate.getElement(1));
if (argLeft.getTermType() == Term.TYPE_ATOM) {
// the first case
final TermInteger result;
try {
result = new TermInteger(argLeft.getText().trim());
}
catch (NumberFormatException ex) {
return false;
}
return argRight.Equ(result);
}
else {
// the second case
Term result = new Term(argRight.getText());
return argLeft.Equ(result);
}
}
@Predicate(Signature = "str_real/2", Template = {"+atom,?number", "?atom,+number"}, Reference = "Convert a text atom to a real numeric atom (or back).")
@Determined
public static final boolean predicateSTRREAL(final Goal goal, final TermStruct predicate) {
final Term argLeft = Utils.getTermFromElement(predicate.getElement(0));
final Term argRight = Utils.getTermFromElement(predicate.getElement(1));
if (argLeft.getTermType() == Term.TYPE_ATOM) {
// the first case
final TermFloat result;
try {
result = new TermFloat(argLeft.getText().trim());
}
catch (NumberFormatException ex) {
return false;
}
return argRight.Equ(result);
}
else {
// the second case
Term result = new Term(argRight.getText());
return argLeft.Equ(result);
}
}
/**
* The constructor
*/
public ProlStringLibrary() {
super("ProlStringLib");
}
}