Как смоделировать «внешнее соединение» в core.logic?

Я только начал играть с core.logic, и для работы над ним я пытаюсь реализовать что-то простое, похожее на проблему, над которой я сейчас профессионально работаю. Однако одна часть проблемы поставила меня в тупик ...

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

(defrel items Name Color)
(defrel restricted-to Country Name)
(defrel not-allowed-in Country Name)

(facts items [['Purse 'Blue]
              ['Car 'Red]
              ['Banana 'Yellow]])

(facts restricted-to [['US 'Car]])

(facts not-allowed-in [['UK 'Banana]
                       ['France 'Purse]])

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

Как написать правило, которое дает список элементов / цветов для страны со следующими ограничениями:

  • Элемент должен быть в списке элементов
  • Страна / элемент не должен находиться в список "запрещенных"
  • Либо:
    • Нет страны в списке с ограниченным доступом для этого элемента
    • Пара страна / элемент находится в списке с ограниченным доступом

Есть ли способ сделать это? Я думаю о вещах совершенно неправильно?

16
задан kolen 7 October 2014 в 19:13
поделиться