Я считаю, что общее решение для всех инфиксных отношений невозможно, потому что синтаксический анализатор не знает о символах отношений в отдельности. Как видно из реализации в mixfix.ML, объявление инфикса с символом отношения <
эквивалентно двум объявлениям миксфикса, а именно "op <"
и "(_ < _)"
с соответствующими приоритетами.
Однако есть более общее и элегантное решение, чем введение сокращений для всех комбинаций предикатов и преобразователей предикатов. Во-первых, введите синтаксическую категорию для реляционных символов. Чтобы также получить правильный вывод, добавьте синтаксический маркер _infix
nonterminal rel
syntax (output) "_infix" :: "rel ⇒ logic" ("_")
Затем объявите синтаксическую константу _rtranclp_rel
для инфиксного использования с инфиксными отношениями.
syntax "_rtranclp_rel" :: "logic ⇒ rel ⇒ logic ⇒ logic" ("(_ _⇧*⇧* _)")
translations "_rtranclp_rel x R y" ⇀ "CONST rtranclp R x y"
translations "_rtranclp_rel x (_infix R) y" ↽ "CONST rtranclp R x y"
Теперь добавьте перевод синтаксиса в ваше отношение rel
, которое вы хотите использовать с _rtranclp_rel
:
consts rel :: "nat ⇒ nat ⇒ bool" (infix "⇒" 100)
syntax "_rel_infix" :: rel ("⇒")
translations "_rel_infix" ⇀ "CONST rel"
translations "_rel_infix" ↽ "_infix (CONST rel)"
Затем Изабель сможет правильно разобрать и красиво напечатать x ⇒⇧*⇧* z
. Обратите внимание, однако, что все полностью примененные экземпляры rtranclp
являются инфиксным символом, напечатанным красиво (например, rtranclp R x y
, независимо от того, является ли отношение инфиксным символом.
Затем этот механизм работает и для вашей функции foo
:
consts foo :: "('a ⇒ 'a ⇒ bool) ⇒ ('b ⇒ 'b ⇒ bool) ⇒ 'b ⇒ 'a ⇒ 'a ⇒ bool"
syntax "_foo_rel" :: "logic ⇒ rel ⇒ rel ⇒ logic ⇒ logic ⇒ logic" ("_ '(_;_')⇗_⇖ _")
translations "_foo_rel x R S y z" ⇀ "CONST foo R S x y z"
translations "_foo_rel x (_infix R) (_infix S) y z" ↽ "CONST foo R S x y z"
Конечно, приоритеты в аннотациях миксфиксов должны быть скорректированы до разумных. Можно даже сделать это рекурсивно. Например:
syntax "_rtranclp_rel2" :: "rel ⇒ rel" ("_⇧*⇧*")
translations "_rtranclp_rel2 R" ⇀ "CONST rtranclp R"
translations "_rtranclp_rel2 (_infix R)" ↽ "_infix (CONST rtranclp R)"
term "x (⇒⇧*⇧*;⇒)⇗y⇖ z"
person
Andreas Lochbihler
schedule
24.09.2014
foo
и почемуy
используется дважды?). Не могли бы вы уточнить? - person chris   schedule 24.09.2014