2010-02-17 9 views
8

Estoy buscando una biblioteca/ensamblaje que me permita trabajar con variables lógicas en F #. Quiero evitar reinventar la rueda en la implementación de la estructura de datos requerida unión-hallazgo, código de unificación y así sucesivamente.Soporte de variables lógicas para .NET

He encontrado Prolog.NET, pero el manual es un poco escaso. No quiero una implementación completa de Prolog, pero solo el tratamiento de las variables lógicas y el manual son algo que faltan en ese sentido.

Aquí es lo que yo quiero ser capaz de hacer:

  • declarar nuevas variables lógicas
  • enlazar un log.var. a un término (preferiblemente la biblioteca permite términos completos de Herbrand para eso)
  • equalize log.vars. (es decir, unificación)
  • meta-tratamiento de log.vars. (¿está en tierra ?, ¿con qué otros log.vars se ha ecualizado? ...)
  • finalmente, la biblioteca incluso admite la coincidencia, es decir, la unificación unilateral.

¿Alguien sabe una biblioteca que hace todo esto, o bibliotecas que al menos podrían utilizarse como punto de partida?

+0

¿Alguien está al tanto de cualquier progreso en esto desde las últimas respuestas a continuación? (2010) – mavnn

Respuesta

2

Mini-Kanren ha sido implemented for Scala. No soy un programador de .NET, y no puedo decir qué tan útil es para usted, pero Mini-Kanren se ajusta a sus requisitos en términos de un lenguaje de variable lógica programática: si la incrustación de Scala en .NET tiene propiedades compatibles con lo que lo buscas, entonces deberías estar allí.

3

No conozco una biblioteca de improviso que haga lo que quiera. Sin embargo, tengo una implementación de "union-find in F #" en this blog entry. Y desde mis días en la universidad, me parece recordar que algún libro popular sobre Scheme tenía un algoritmo de unificación básico, que usé para codificar una implementación de 'mini-prólogo' en el día. Así que siento que esto es algo que alguien con la experiencia adecuada podría armar en un fin de semana, en caso de que alguien esté buscando un proyecto. (Quizás lo agregue a mi propia lista TODO del fin de semana).

+0

¿Quizás estás pensando en The Reasoned Schemer? Define una DSL llamada mini-kanren que se integra bastante bien con Scheme, y una traducción a F # no debería ser difícil. –

+1

Eso está bien. Pero como dije antes, estaba buscando un código existente. No es que no pueda implementarlo todo por mi cuenta, pero sería una pérdida de tiempo si alguien más hiciera ese trabajo. – Frank

4

Tengo una incrustación básica de programación lógica en F #. Lo desarrollé para el curso que enseño sobre "Programación de paradigmas", que usa F # en todas partes e incluye un par de conferencias sobre programación lógica.

El código utiliza actualizaciones imperativas para reflejar las sustituciones debidas a la unificación, y utiliza las continuidades de éxito. Por lo tanto, es relativamente diferente de, por ejemplo, Kanren.

no estoy seguro de cómo mucho sentido las notas harán por sí mismos, pero se pueden encontrar esta incrustación al final de: http://undergraduate.csse.uwa.edu.au/units/CITS3242/16-logic-prog.pdf

puedo proporcionar una versión refinada de esta incrustación bajo petición.

Cuestiones relacionadas