【问题标题】:Replace portions of a list with another in Prolog在 Prolog 中用另一个列表替换部分列表
【发布时间】:2017-12-14 09:50:18
【问题描述】:

我想在 Prolog 的列表中将 b,c 替换为 x,y,z。我有一个列表[a,b,c,d,e,f],结果将是[a,x,y,z,d,e,f]。我怎样才能在 Prolog 中写这个?

replace([],_,[]).
replace([x|T1],Var,[Y|T2]):-
      member(X=Y,var),
      !
   ;  X=Y
   ),
   replace(T1,Var,T2).

-? replace([a,b,c,d,e,f],[b,c=x,y,z],R).

【问题讨论】:

  • 您的程序中有印刷错误。另外,试试write_canonical([b,c=x,y,z])。 Prolog 并不像你想象的那样看待这个术语。以列表表示法编写,它被视为:[b, =(c,x), y, z]。如果b,c 在您的列表中出现多次怎么办?是否需要替换所有匹配项?
  • 这里有个提示:想一想如何使用append/3 to判断一个列表P是否是列表L的前缀。
  • 你的查询应该是replace([a,b,c,d,e,f], [b,c], [x,y,z], R). 是你给这个谓词的参数赋予意义的程序员。

标签: replace prolog substitution


【解决方案1】:

这本质上相当于replacing substrings in Prolog的问题。使用replace_substring/4 谓词,您可以用这种方式替换列表的子序列:

:- initialization(main).
:- set_prolog_flag(double_quotes, chars). 

main :-
    replace_substring([a,b,c,d,e,f],[b,c],[x,y,z],Result),
    writeln(Result).

replace_substring(String, To_Replace, Replace_With, Result) :-
    append([Front, To_Replace, Back], String),
    append([Front, Replace_With, Back], Result).

这个程序打印[a,x,y,z,d,e,f]

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2018-06-06
    • 2013-08-26
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多