Приоритет оператора Пролога и соответствие правил - PullRequest
6 голосов
/ 20 апреля 2009

В моем интерпретаторе пролога загружены следующие два факта:

foo(U+V,1).
foo(U*V,2).

Теперь я пробую следующие запросы с такими результатами:

foo(x*x+x,R).  -->  R = 1
foo(x+x*x,R).  -->  R = 1
foo(x*x*x,R).  -->  R = 2

Теперь я пытаюсь выполнить следующий запрос:

foo(x*x-x,R).  -->  no

Как я понимаю, это объясняется тем, как приоритет оператора строит выражение дерева:

x+x*x  -->  +           so it matches with  -->  +
           / \                                  / \
          x   *                                U   V
             / \
            x   x

x-x*x  -->  -           DOES NOT matches any fact.
           / \                             
          x   *                                
             / \
            x   x

Правильно ли это объяснение?

1 Ответ

4 голосов
/ 20 апреля 2009

Да, это правильно.

Приоритет оператора по умолчанию определяется как естественный, то есть используется обычный математический приоритет. Но если вам это не нравится, вы можете переопределить его.

Является ли изменение приоритета отличной идеей, это другой вопрос, он эффективно меняет синтаксис Prolog и может привести к проблемам с анализом. Особенно, если вы измените приоритет операторов для синтаксиса Prolog с приоритетом выше 1000.

...