Algorithm 寻找满足给定函数的自变量的算法';回归

Algorithm 寻找满足给定函数的自变量的算法';回归,algorithm,f#,functional-programming,prolog,unification,Algorithm,F#,Functional Programming,Prolog,Unification,我有一个特殊的问题,我还没有解决办法。我想如果我知道它存在一个相关的算法会有所帮助 我正在寻找的算法有助于找到满足函数返回的目标的参数 例如,a为b工作表示为(a,b) 函数起作用将确保它们与布尔值的关系 let works a b -> true let works b c -> true 现在我得到了 [ (a, "x"); ("x", c) ] 如果我希望这两个绑定为true,那么这个函数必须为true let works a "x" -> true let work

我有一个特殊的问题,我还没有解决办法。我想如果我知道它存在一个相关的算法会有所帮助

我正在寻找的算法有助于找到满足函数返回的目标的参数

例如,
a为b工作
表示为
(a,b)

函数
起作用
将确保它们与布尔值的关系

let works a b -> true
let works b c -> true
现在我得到了

[ (a, "x"); ("x", c) ]
如果我希望这两个绑定为true,那么这个函数必须为true

let works a "x" -> true
let works "x" c -> true
现在我正试图编写一个函数/算法,帮助我实现这样的
“x”=b

我正在考虑回溯,但还不知道如何实现。如果有人能给我一个提示,我将不胜感激


作为旁注,我用函数编程范式在F#中实现算法。

您描述的算法是--它是Prolog的基础,在F#中实现并不十分困难

我建议你读约翰·哈里森的(,);第3.9节介绍了统一算法。如果你想看一看的话,去年我和另外两个F#ers将书中的代码移植到了F#


根据您对这个问题的描述,您可能可以用一些简单的约束逻辑编程(CLP)来解决它,但恐怕还没有人为F#实现CLP库。和是这类系统的两个流行、简单的例子,如果你有兴趣的话,我怀疑它们移植到F#会花费很多时间。

你需要的是正确的,Jack需要统一,但具体来说,你需要使用反向链接的语法统一

你的问题并不是新问题,但已经得到了更彻底的回答

虽然这会让你走上正确的道路,但取决于你想解决的问题,你可能会发现这可能不像看上去那么容易

编辑

我在我拥有的一些工作F#代码上测试了你的示例,它确实有效,但是我不能向公众发布代码,对不起

对于您给定的示例,只需统一即可完成,而无需反向链接

你需要为自己创造事实

有效(a,b)。
工程(b、c)。
还有一个问题

works(a,X),works(X,c)。
答案是

X=b

如果你想在中间扩展一个以上的人,那么你需要使用反向链接,因为你必须创建递归的从属规则。 你需要为自己创造事实

有效(a,b)。
工程(b、c)。
工程(c、d)。
规则

下属(X,Z):-works(X,Z)。
下属(X,Z):-工作(X,Y),下属(Y,Z)。
还有一个问题

下属(a,X),下属(X,d)。
答案是

X=b,c
您必须创建类型、统一和反向链接算法。您可以选择在REPL上创建解析器、漂亮的打印机和层,但这不是必需的

事实、规则和查询是以人工方式显示的,但是如果您跳过解析器和漂亮的打印机,您将不得不将它们编码为AST。i、 e

(“作品,[Const“a”,Const“b]”)
大写字母表示Prolog变量。i、 e.X Y Z
小写字母表示Prolog常量。i、 e.a.b.c

您的有效问题只是经典祖先示例的一个变体。请参阅:

听起来像是一场灾难。
let works a "x" -> true
let works "x" c -> true