Acabo de empezar a jugar con core.logic, y para trabajar en ello, intento implementar algo simple que sea similar a un problema en el que actualmente estoy trabajando profesionalmente. Sin embargo, una parte del problema me ha dejado perplejo ...Cómo simular una 'unión externa' en core.logic?
Como una simplificación de mi ejemplo, si tengo un catálogo de artículos, y algunos de ellos solo están disponibles en ciertos países, y algunos no están disponibles en determinados países. Me gustaría ser capaz de especificar la lista de artículos, así como las excepciones, algo así como:
(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]])
Si es posible, prefiero no especificar permitido en todos los países, como el conjunto de elementos, con restricciones es relativamente pequeño, y me gustaría poder hacer un único cambio para permitir/excluir un artículo para un país determinado.
¿Cómo puedo escribir una regla que da la lista de los artículos/colores para un país, con las siguientes limitaciones:
- El artículo debe estar en la lista de elementos
- El país/El artículo debe que no esté en la lista 'en no permitido'
- O bien:
- no hay ningún país en el restringida a la lista de ese elemento
- el par de países/elemento está en la restricted- a la lista
¿Hay alguna manera de hacer esto? ¿Estoy pensando en cosas completamente equivocadas?
Por los argumentos de tierra ', supongo que te refieres un valor, en lugar de las variables de consulta? Disculpas, mi último roce con la programación lógica fue un curso de prólogo de pregrado hace casi 25 años ... –
No puede ser una variable desatada o unground. Un valor es molido si no contiene variables lógicas independientes (por ejemplo, [1 2 0._] no está en la tierra). Esto se vuelve relevante si la función es un objetivo y está pasando variables de consulta como argumentos. En este sentido, 'items-colors-for-country' requiere que su primer argumento sea molido. El objetivo es más flexible y composable que mi respuesta inicial. Por ejemplo, podemos consultar los colores de los monederos disponibles en EE. UU. https://gist.github.com/1557417 – Ambrose
¡Gracias por la explicación! –