// Path: engine/jprol-core/src/main/java/com/igormaznitsa/jprol/utils/Utils.java
// public static String escapeSrc(final String string) {
// 
//   if (string.length() == 0) {
//     return string;
//   }
// 
//   final StringBuilder builder = new StringBuilder(string.length());
// 
//   for (int li = 0; li < string.length(); li++) {
//     final char curChar = string.charAt(li);
// 
//     switch (curChar) {
//       case '\\':
//         builder.append("\\\\");
//         break;
//       case '\'':
//         builder.append("\\'");
//         break;
//       case '\"':
//         builder.append("\\\"");
//         break;
//       case '\n':
//         builder.append("\\n");
//         break;
//       case '\f':
//         builder.append("\\f");
//         break;
//       case '\r':
//         builder.append("\\r");
//         break;
//       case '\t':
//         builder.append("\\t");
//         break;
//       case '_': {
//         builder.append('_');
//       }
//       break;
//       case '%':
//       case '.':
//       default: {
//         builder.append(curChar);
//       }
//       break;
//     }
//   }
// 
//   return builder.toString();
// }
// 
// Path: engine/jprol-core/src/main/java/com/igormaznitsa/jprol/exceptions/ProlTypeErrorException.java
// public class ProlTypeErrorException extends ProlAbstractCatcheableException {
// 
//   private static final long serialVersionUID = -3258214534404942716L;
// 
//   private static final Term TERM_ERROR = newAtom("type_error");
// 
//   private final String validType;
// 
//   public ProlTypeErrorException(final String validType, final Term culprit, final Throwable cause) {
//     super(culprit, cause);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public ProlTypeErrorException(final String validType, final String message, final Term culprit,
//                                 final Throwable cause) {
//     super(message, culprit, cause);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public ProlTypeErrorException(final String validType, final String message, final Term culprit) {
//     super(message, culprit);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public ProlTypeErrorException(final String validType, final Term culprit) {
//     super(culprit);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public String getValidType() {
//     return validType;
//   }
// 
// 
//   @Override
//   public Term getErrorTerm() {
//     return TERM_ERROR;
//   }
// 
//   @Override
//   public TermStruct getAsStruct() {
//     return this.makeErrorStruct(TERM_ERROR, asTermList(newAtom(this.validType), getCulprit()));
//   }
// 
// }


import static com.igormaznitsa.jprol.data.TermType.ATOM;
import static com.igormaznitsa.jprol.utils.Utils.escapeSrc;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toMap;
import com.igormaznitsa.jprol.exceptions.ProlTypeErrorException;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
    return (T) this;
  }

  public Stream<Term> stream() {
    return Stream.of(this);
  }

  public Stream<TermVar> variables() {
    return Stream.empty();
  }

  public String toSrcString() {
    return String.format("'%s'", escapeSrc(getText()));
  }

  @Override
  public String toString() {
    return toSrcString();
  }

  @Override
  public int hashCode() {
    if (text == null) {
      return super.hashCode();
    } else {
      return text.hashCode();
    }
  }

  public Number toNumber() {
// Path: engine/jprol-core/src/main/java/com/igormaznitsa/jprol/utils/Utils.java
// public static String escapeSrc(final String string) {
// 
//   if (string.length() == 0) {
//     return string;
//   }
// 
//   final StringBuilder builder = new StringBuilder(string.length());
// 
//   for (int li = 0; li < string.length(); li++) {
//     final char curChar = string.charAt(li);
// 
//     switch (curChar) {
//       case '\\':
//         builder.append("\\\\");
//         break;
//       case '\'':
//         builder.append("\\'");
//         break;
//       case '\"':
//         builder.append("\\\"");
//         break;
//       case '\n':
//         builder.append("\\n");
//         break;
//       case '\f':
//         builder.append("\\f");
//         break;
//       case '\r':
//         builder.append("\\r");
//         break;
//       case '\t':
//         builder.append("\\t");
//         break;
//       case '_': {
//         builder.append('_');
//       }
//       break;
//       case '%':
//       case '.':
//       default: {
//         builder.append(curChar);
//       }
//       break;
//     }
//   }
// 
//   return builder.toString();
// }
// 
// Path: engine/jprol-core/src/main/java/com/igormaznitsa/jprol/exceptions/ProlTypeErrorException.java
// public class ProlTypeErrorException extends ProlAbstractCatcheableException {
// 
//   private static final long serialVersionUID = -3258214534404942716L;
// 
//   private static final Term TERM_ERROR = newAtom("type_error");
// 
//   private final String validType;
// 
//   public ProlTypeErrorException(final String validType, final Term culprit, final Throwable cause) {
//     super(culprit, cause);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public ProlTypeErrorException(final String validType, final String message, final Term culprit,
//                                 final Throwable cause) {
//     super(message, culprit, cause);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public ProlTypeErrorException(final String validType, final String message, final Term culprit) {
//     super(message, culprit);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public ProlTypeErrorException(final String validType, final Term culprit) {
//     super(culprit);
//     this.validType = validType == null ? UNDEFINED.getText() : validType;
//   }
// 
//   public String getValidType() {
//     return validType;
//   }
// 
// 
//   @Override
//   public Term getErrorTerm() {
//     return TERM_ERROR;
//   }
// 
//   @Override
//   public TermStruct getAsStruct() {
//     return this.makeErrorStruct(TERM_ERROR, asTermList(newAtom(this.validType), getCulprit()));
//   }
// 
// }


// Path: engine/jprol-core/src/main/java/com/igormaznitsa/jprol/data/Term.java
import static com.igormaznitsa.jprol.data.TermType.ATOM;
import static com.igormaznitsa.jprol.utils.Utils.escapeSrc;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toMap;
import com.igormaznitsa.jprol.exceptions.ProlTypeErrorException;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

    return (T) this;
  }

  public Stream<Term> stream() {
    return Stream.of(this);
  }

  public Stream<TermVar> variables() {
    return Stream.empty();
  }

  public String toSrcString() {
    return String.format("'%s'", escapeSrc(getText()));
  }

  @Override
  public String toString() {
    return toSrcString();
  }

  @Override
  public int hashCode() {
    if (text == null) {
      return super.hashCode();
    } else {
      return text.hashCode();
    }
  }

  public Number toNumber() {
    throw new ProlTypeErrorException("numeric", "NonNumeric term", this);