【发布时间】:2010-12-17 23:30:43
【问题描述】:
我目前参与的项目是开发一个应用程序,该应用程序能够考虑一组节点和连接,并找到两个节点之间的最短路径(一个常见且众所周知的问题)(在允许的连接上)。好吧,我真的不必从零开始构建应用程序,而只需要在 f# 中“转换”一个 Prolog 预先存在的应用程序。 我想了一下,最后问了自己一个问题:“与其开发一个特殊用途的解决方案并实现专门针对这个问题的新算法,我是否可以创建一个能够接受像 Prolog 这样的事实并使用它们来进行查询或其他事情的程序类似吗?”。
通过这样做,我将创建一组事实(如在 Prolog 中),然后使用它们进行查询。 所以,现在考虑到这个新问题(在 F# 中转换 Prolog),我需要找到一种方法来创建这样的事实:
myfact1(el1, el2,..., eln).
myfact2(el1, el2,..., elm).
...
myfactk(el1, el2,..., elp).
到类似语法的东西,例如:
fact factname1: el1 el2 ... eln;
fact factname2: el1 el2 ... elm;
...
fact factnamek: el1 el2 ... elp;
我知道 F# 非常适合解析,所以我认为解析 this 可能不会有问题。
好的!现在它已经被解析了,我应该定义一个算法,在解析代码时,将所有事实存储在某种知识中(只不过是一张表)。为了建立所有需要的关联。
例如,一个解决方案可能是一个考虑所有关联的哈希表
factname1 -> el1
factname1 -> el2
...
factname1 -> eln
factname2 -> el1
factnale2 -> el2
...
factname2 -> elm
factname3 -> el1
...
...
factnamek -> el1
factnamek -> el2
...
factnamek -> elp
通过这样做,我将始终能够解决查询。 例如考虑以下 Prolog 事实
mother(A, B) % This means that A is mother of B
mother(C, D)
在 F# 中我创建
事实母亲:A B; 事实母亲:C D;
我的哈希表是:
母亲-> A |乙 母亲-> C | D
第一个列是事实名称,第二个是值(这里是一个元组)。
如果我要搜索:“谁是B的母亲”-->我搜索母亲,寻找价值,我找到B,我在元组中寻找A!
嗯,它似乎工作。 但事实很容易实现。规则呢? 例如规则父母:
parents(A, B, C) :- mother(A, C), father (B, C)
在 F# 中使用我的语法?好吧,我想出了这个主意:
rule parents: A, B, C => mother A C and father B C
当我的解析器遇到规则时,它应该怎么做?我想像我一样在表中创建某种记录,然后能够进行查询以指定主题并获取其父母或指定父亲并获取所有儿子等等...... 你会怎么做?
【问题讨论】:
标签: parsing f# prolog language-design pattern-matching