【问题标题】:replace an element in list with its first occurence but keep replacing for all occurences- Prolog用第一次出现的元素替换列表中的元素,但继续替换所有出现的元素-Prolog
【发布时间】:2021-06-18 11:20:33
【问题描述】:

我刚刚开始使用 tkeclipse 在 Prolog 中编程。我想要做的是在它出现的第一个地方用另一个元素替换列表中的一个元素。但是,当我按下更多按钮 (;) 时,我希望查询也返回其他解决方案。示例:

?- replace(1,a,[1,2,3],R).

R = [a, 2, 3]
Yes
?- replace(1,a,[1,2,1,1,3],R).
R = [a, 2, 1, 1, 3] ;
R = [1, 2, a, 1, 3] ;
R = [1, 2, 1, a, 3] ;
No

到目前为止,我写的一切正常,但最后,在 [1,2,1,a,3] 之后,我也得到 [1,2,1,1,3] 而不是 no。我的代码如下:

%%% replace/4

replace(_,_,[],[]).
replace(X,Y,[X|T],[Y|T]).


replace(X,Y,[H|T],[H|T2]) :-  
    replace(X,Y,T,T2).

【问题讨论】:

    标签: list replace prolog


    【解决方案1】:

    只需删除第一个子句

    replace(_,_,[],[]).
    

    你应该没事的。

    【讨论】:

      【解决方案2】:

      [1,2,1,1,3] 因为:

      replace(1,a,[1,2,1,1,3],[1,2,1,1,3]) 成功了

      • 始终采用第三个子句,逐个元素减少替换前列表和替换结果列表
      • 通过第一个子句在空列表上成功

      你想要:

      1. 空列表成功(0 次替换);还有
      2. 一连串完全一致的替换

      所以:

      replace(_,_,[],[]) :- !. % make this deterministic with a a cut
      
      replace(X,Y,PreList,PostList) :-
         replace_2(X,Y,PreList,PostList).
      
      % replace_2/4 is the same as replace/4 but does NOT succeed for the empty list
      
      replace_2(X,Y,[X|T],[Y|T]).
      
      replace_2(X,Y,[H|T],[H|T2]) :-  
          replace_2(X,Y,T,T2).
      

      所以:

      ?- replace(1,a,[1,2,3],R).
      R = [a, 2, 3] ;
      false.
      
      ?- replace(1,a,[1,2,1,1,3],R).
      R = [a, 2, 1, 1, 3] ;
      R = [1, 2, a, 1, 3] ;
      R = [1, 2, 1, a, 3] ;
      false.
      
      ?- replace(foo,a,[1,2,1,1,3],R).
      false.
      
      ?- replace(foo,a,[],R).
      R = [] ;
      false.
      

      【讨论】:

      • 您为什么希望replace(foo,a,[],[]) 成功?没有更换 ;-) replace(1, a, [2,3,4], R) 也没有成功。
      • @tiffi 我不知道!我只是在执行命令!
      • 你在进行私人谈话吗?我找不到这样的订单。
      • @tiffi “我写的到目前为止,工作正常,但是……”比较清楚。
      • 我将此解释为“对于第一个示例以及直到某个点对于第二个示例都可以正常工作” - 我没有看到任何迹象表明他希望对空列表进行特殊处理。
      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2021-02-07
      • 2018-10-30
      • 2011-08-27
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多