Предикаты

В математической логике под предикатом принято понимать булевозначную функцию. Однако мы используем расширенное понятие логического типа вместо булевского. И предикат может возвращать три значения: true, false и none (undefined).

Если предикат возвращает none, вы должны рассматривать это как исключение. Например, произошел тайм-аут. none означает, что предикат не смог вычислить true или false.

Чтобы создать предикат в семантической модели, необходимо набрать ключевое слово def. Затем появляется шаблон предиката. И вы можете указать имя предиката, его аргументы и тело предиката, которое является логическим выражением.

def

Имя предиката может содержать пробелы. Также вы можете использовать не только латиницу, но и другие национальные алфавиты …

Шаблон предиката создается без аргументов. Чтобы добавить аргумент, поместите курсор внутрь круглых скобок и нажмите Enter или Insert.

Тело предиката может быть любым логическим выражением языка d0sl: and, or, not, check all, if, for all. Но для простоты мы советуем начинать тело предиката с инструкции check all. Инструкция check all эквивалентна инструкции and с большим количеством аргументов, каждый из которых находится в новой строке.

Пример определения предиката

def check board(board : ChessBoard) means
  check all
    var queens = ChessDSL.get queens(board)
    for all q1, q2 in queens
      not ChessDSL.on one line(q1, q2) and
      not ChessDSL.on one diagonal(q1, q2)
  end
end def