Prolog 元谓词:将谓词应用于列表,传递常量
假设您需要一个谓词将列表中的 Number1 替换为 Number2。
当然,为此编写一个递归函数很简单,例如:
replace(_,_,[],[]).
replace(N1,N2,[N1|T], [N2|NT]):-
replace(N1,N2,T,NT).
replace(N1,N2,[H|T],[H|NT]):-
replace(N1,N2,T,NT).
我的问题是是否有一种方法可以使用 maplist/x (或类似的元谓词)来做到这一点。
人们可以使用全局变量来做到这一点,例如:
replace(N1,N2,L1,L2):-
nb_setval(numbers,[N1,N2]),
maplist(replace_in,L1,L2).
replace_in(N1,N2):-
nb_getval(numbers,[N1,N2]).
replace_in(X,X).
另一种想法是创建相同数字 List_of_N1 和 List_of_N2 的列表,并将它们传递给 maplist/4。
他们对我来说都不有吸引力,有什么想法吗?
Assume that you want a predicate that replaces Number1 with Number2 in a list.
Of course it is trivial to write a recursive function for that, like:
replace(_,_,[],[]).
replace(N1,N2,[N1|T], [N2|NT]):-
replace(N1,N2,T,NT).
replace(N1,N2,[H|T],[H|NT]):-
replace(N1,N2,T,NT).
My question is if there is a way to do that with maplist/x (or similar meta-predicates).
One might use global variables to do that, like:
replace(N1,N2,L1,L2):-
nb_setval(numbers,[N1,N2]),
maplist(replace_in,L1,L2).
replace_in(N1,N2):-
nb_getval(numbers,[N1,N2]).
replace_in(X,X).
Another idea is to create a list of the same numbers List_of_N1 and List_of_N2 and pass them to maplist/4.
None of them look attractive to me, any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
顺便说一句:根据您给定的定义,请考虑例如显然无意的第二个解决方案:
至于实际问题,请考虑:
示例查询:
对于 逻辑纯度,我推荐一个真正的关系版本,可以在各个方向使用:
示例:
As an aside: With your given definition, consider for example the apparently unintended second solution in:
As to the actual question, consider:
Example query:
For logical-purity, I recommend a truly relational version which can be used in all directions:
Example:
这个怎么样:
How about this: