Prolog 元谓词:将谓词应用于列表,传递常量

发布于 2024-12-06 03:47:25 字数 582 浏览 0 评论 0原文

假设您需要一个谓词将列表中的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

何止钟意 2024-12-13 03:47:25

顺便说一句:根据您给定的定义,请考虑例如显然无意的第二个解决方案:

?- replace(1, 4, [1,2,3], Ls).
Ls = [4, 2, 3] ;
Ls = [1, 2, 3] ;
false.

至于实际问题,请考虑:

replace(A, B, X, Y) :- ( X == A -> Y = B ; Y = X ).

示例查询:

?- maplist(replace(1,4), [1,2,3], Ls).
Ls = [4, 2, 3].


对于 ,我推荐一个真正的关系版本,可以在各个方向使用:

replacement(A, B, A, B).
replacement(A, _, X, X) :- dif(A, X).

示例:

?- maplist(replacement(a,b), [X], Rs).
Rs = [b],
X = a ;
Rs = [X],
dif(X, a).

As an aside: With your given definition, consider for example the apparently unintended second solution in:

?- replace(1, 4, [1,2,3], Ls).
Ls = [4, 2, 3] ;
Ls = [1, 2, 3] ;
false.

As to the actual question, consider:

replace(A, B, X, Y) :- ( X == A -> Y = B ; Y = X ).

Example query:

?- maplist(replace(1,4), [1,2,3], Ls).
Ls = [4, 2, 3].


For , I recommend a truly relational version which can be used in all directions:

replacement(A, B, A, B).
replacement(A, _, X, X) :- dif(A, X).

Example:

?- maplist(replacement(a,b), [X], Rs).
Rs = [b],
X = a ;
Rs = [X],
dif(X, a).
木槿暧夏七纪年 2024-12-13 03:47:25

这个怎么样:

replace(N1,N2,L1,L2):-
    maplist(replace_in,[N1-N2-T|T], L1,L2).

replace_in(N1-N2-T, X, Y):-
  (X=N1 -> Y=N2 ; Y=X),
  (T=[N1-N2-L|L] ; T=[]).

How about this:

replace(N1,N2,L1,L2):-
    maplist(replace_in,[N1-N2-T|T], L1,L2).

replace_in(N1-N2-T, X, Y):-
  (X=N1 -> Y=N2 ; Y=X),
  (T=[N1-N2-L|L] ; T=[]).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文