如何在Prolog中创建将函数应用于值并返回结果的谓词?
用Prolog实现类似Python的高阶函数功能
嘿,刚接触Prolog确实容易被它和Python的差异搞懵——毕竟一个是命令式/函数式编程,一个是逻辑式编程,范式差得挺远的!你提到的“函数”在Prolog里其实是谓词,它不是直接返回值,而是通过绑定变量来描述关系,这是两者的核心区别。
先回顾你的Python代码:
def get_result(func, inpt): return func(inpt)
这是个高阶函数,接受一个函数和输入,返回函数调用的结果。在Prolog里,我们可以借助内置的call/N系列谓词来实现类似的功能,它能帮我们动态调用谓词。
具体实现步骤
首先,我们需要先定义几个作为“动作”的谓词(对应Python里的函数),比如:
% 定义:Y是X的两倍 double(X, Y) :- Y is X * 2. % 定义:Y是X加1后的结果 add_one(X, Y) :- Y is X + 1.
这些谓词的最后一个参数就是我们要“获取”的结果,和你理解的把返回值放最后参数的思路一致。
接下来实现核心的get_result/3谓词,它接受三个参数:动作谓词、输入值、结果变量。我们只需要用call/3来动态调用这个动作谓词即可:
get_result(Action, Input, Result) :- call(Action, Input, Result).
怎么使用?
打开Prolog解释器,输入查询就能看到效果:
- 调用
double动作:
解释器会返回:?- get_result(double, 5, R).R = 10. - 调用
add_one动作:
解释器会返回:?- get_result(add_one, 3, R).R = 4.
关键知识点说明
call/N的作用:这是Prolog的内置谓词,call/3表示调用一个接受两个参数的谓词(第一个参数是谓词名,后面两个是谓词的参数)。如果你的动作谓词参数更多,比如三元谓词,就用call/4,以此类推。- 变量与原子:Prolog里大写开头的是变量(比如
Action、Result),小写开头的是原子(比如double、add_one),查询时变量会被绑定到满足关系的值。 - 逻辑式的思维:Python里是“执行函数得到结果”,而Prolog里是“描述
Action(Input, Result)这个关系成立的条件”,解释器会帮你找到所有满足条件的Result值。
内容的提问来源于stack exchange,提问作者Pro Q
相关产品推荐
相关产品推荐

