Что означает «предикат.arg (1)» и «предикат.арность» в Java - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть некоторый Java-код, который я пытаюсь перевести на vb.net.Он использует «предикаты», функция, о которой я не знал, существовал до сих пор, но которая существует и в vb.net.

Так что я читаю документацию по нему, но ничто из этого не объясняет Java-код, который у меня есть, в частности, если у вас есть переменная 'p', объявленная как предикат, что делает p.arity и что p.arg (0) и p.arg (1) возвращают?

У меня сложилось общее впечатление, что предикат принимает набор объектов и возвращает подмножество, соответствующее определенным критериям (например, учитывая наборвсе баскетболисты, возвращайте только тех, кто выше 6 футов).Но следующий код, похоже, не имеет к этому никакого отношения:

    // st is assumed to be a list of ECHO predicates
    //
  private void parseInput(StreamTokenizer st) throws IOException
  {

while (st.nextToken() != StreamTokenizer.TT_EOF) {
  st.pushBack();
  Predicate p = new Predicate(st);
  parsePredicate(p);
} // while
  }


  // PRE: p is non-null
  // POST: performs the additions to the ECHO graph required by the
  //       ECHO predicate; if p is not a legal ECHO predicate, an 
  //       IOException is thrown
  //
  private void parsePredicate(Predicate p) throws IOException
 {
Assert.notNull(p);
String name = p.name();

if (name.equalsIgnoreCase(explainPred)) {
  parseExplain(p);
} else if (name.equalsIgnoreCase(dataPred)) {
  parseData(p);
} else if (name.equalsIgnoreCase(contradictPred)) {
  parseContradict(p);
} else if (name.equalsIgnoreCase(analogyPred)) {
  parseAnalogy(p);
} else if (name.equalsIgnoreCase(propositionPred)) {
  parseProposition(p);
} else {
  throw new IOException("ECHO: "+name+" is not a legal predicate name. "+
                                                "Must be one of "+explainPred+", "+dataPred+", "+
                                                contradictPred+", or "+analogyPred);
} // if
  }

  //
  // PRE: p's name is explainPred
  // POST: adds the given explanation predicate to ECHO, adding all necessary
  //       links; throws an exception if p is not a legal explains predicate
  //
  private void parseExplain(Predicate p) throws IOException
  {
//msg("in parseExplain...");
int arity = p.arity();
float weight;
List propList;
String explainee;

if (arity == 2) {
  //msg("arity == 2");
  propList = (List)p.arg(0);
  explainee = (String)p.arg(1);
  weight = (float)explainWeight(propList.length());
} else if (arity == 3) {
  //msg("arity == 3");
  propList = (List)p.arg(0);
  explainee = (String)p.arg(1);
  float strength = Float.valueOf((String)p.arg(2)).floatValue();
  weight = (float)(strength*explainWeight(propList.length()));
} else {
  throw new IOException("ECHO: an explains predicate must have 2 or 3 "+
                                                "arguments: "+p);
    } // if

1 Ответ

0 голосов
/ 08 апреля 2019

В этом случае я предполагаю следующее:

arity - количество параметров, которые принимает функция. Вы можете видеть, что после проверки, равен ли arity 2, он читает два аргумента (arg (0) и arg (1)). Таким образом, arg - это просто метод для получения параметра / аргумента по заданному индексу.

Тогда, когда арность равна 3, вы можете получить три аргумента; 0, 1, 2

...