Как создать нечисловые ограничения в Моцарте / Оз? - PullRequest
1 голос
/ 02 марта 2011

Я хочу реализовать CSP с доменом переменных не числовым (что-то вроде [lisa ann mary joanna]).Есть ли способ добиться этого в Моцарте / Оз?

1 Ответ

2 голосов
/ 03 марта 2011

Возможно реализовать такую ​​вещь, как расширение языка в C ++, но в самом языке это невозможно.

Единственными встроенными типами ограничений являются ограничения в конечной области (неотрицательные целые числа), ограничения в конечных наборах (ограничения в области множеств неотрицательных целых чисел) и ограничения записи.

Возможно, вы можете использовать целочисленные константы для моделирования вашей проблемы, например,

declare
  %% 4 constants
  Lisa = 1
  Ann = 2
  Mary = 3
  Joanna = 4

  %% N will be the constrained variable
  N
in
  N::[Lisa Ann Mary Joanna]
  {Show N}   %% displays N{1#4}, i.e. N is between 1 and 4

  N \=: Mary %% tell: N is not Mary
  {Show N}   %% displays N{1 2 4}, i.e. N is one of 1,2,4

Если вы не хотите работать с конечными доменами, существует более общая идея логического программирования. Вы можете создать точки выбора для различных возможных значений переменной, например ::100100

declare

  proc {Script A}
     A =
     choice
        lisa
     [] ann
     [] mary
     [] joanna
     end
  end

  {Show {SearchOne Script}}  %% displays "[lisa]"
  {Show {SearchAll Script}}  %% displays "[lisa ann mary joanna]"

Это также возможно сделать с не статически известным числом значений, используя Комбинаторы .

...