Как использовать набор понимания для тела функции - PullRequest
2 голосов
/ 14 октября 2019

Предположим, у меня есть следующие подписи:

sig A {}
sig B {}

sig P {
    a: A,
    b: B
}

Как мне написать функцию f, скажем, такую, что f возвращает набор P, для которого каждый член имеет значениеx: A для его поля a?

Ввод выражения {p: P | p.a = x} в оценщик возвращает мне набор, но когда я пытаюсь определить f таким образом

fun f(a: A) : set P {
    { p: P | p.a = a }
}

сплав говорит мне, что я допустил ошибку:

Произошла ошибка типа. Это не может быть правовым реляционным соединением, где левая часть - это p (type = {this / P}) правая рукасторона (тип = {это / A})

1 Ответ

1 голос
/ 14 октября 2019

Проблема в том, что вы скрыли отношение a с параметром своей функции. Это работает, если вы замените f(a: A) на f(a': A). В качестве альтернативы вы можете использовать оператор @, который возвращает глобальное вместо локального значения набора:

fun f(a: A) : set P {
    { p: P | p.@a = a }
}
...