相关疑难解决方法(0)

模拟Pr#中的Prolog回溯

我目前正在参与一个项目开发两个节点之间可以考虑一组节点和连接,并找到最短路径的应用程序(一个常见的和众所周知的问题)(上允许的连接).好吧,我不需要从零构建应用程序,但只需要在f#中"转换"Prolog预先存在的应用程序.我以为我对此有所了解,最后问自己一个问题:"我可以创建一个能够接受像Prolog这样的事实并使用它们来进行查询的程序,而不是开发一个特殊用途的解决方案并实现专门针对这个问题的新算法.类似?".

通过这样做,我将创建一组事实(如在Prolog中),然后使用它们来进行查询.所以,考虑到现在这个新问题(在F#中转换Prolog),我需要找到一种方法来创建这样的事实:

myfact1(el1, el2,..., eln).
myfact2(el1, el2,..., elm).
...
myfactk(el1, el2,..., elp).
Run Code Online (Sandbox Code Playgroud)

用类似语法的东西:

fact factname1: el1 el2 ... eln;
fact factname2: el1 el2 ... elm;
...
fact factnamek: el1 el2 ... elp;
Run Code Online (Sandbox Code Playgroud)

我知道F#非常适合解析,所以我认为解析这个可能不是问题.

好!现在它被解析了,我应该定义一个算法,在解析代码时,将所有事实存储在某种知识中(仅仅是一个表).为了使所有需要的关联.

例如,解决方案可能是考虑所有关联的哈希表

factname1 -> el1
factname1 -> el2
...
factname1 -> eln
factname2 -> el1
factnale2 -> el2
...
factname2 -> elm
factname3 -> el1
...
...
factnamek -> el1
factnamek -> el2
...
factnamek -> elp
Run Code Online (Sandbox Code Playgroud)

通过这样做,我将始终能够解决查询.例如,考虑以下Prolog事实

mother(A, B) % This means that A is mother …
Run Code Online (Sandbox Code Playgroud)

f# parsing language-design prolog pattern-matching

6
推荐指数
1
解决办法
1570
查看次数

标签 统计

f# ×1

language-design ×1

parsing ×1

pattern-matching ×1

prolog ×1