Prolog用另一个列表替换列表中的元素

时间:2012-10-12 14:24:35

标签: prolog turbo-prolog

*嗨,我正在尝试用另一个列表替换列表中的元素,并且当turbo prolog在如果C = A->的情况下给出语法错误时我卡住了。将结果列表(L1)放入替换元素的列表中。

domains
    list=integer*
    element=i(integer);l(list)
    lista=element*
predicates
    repl(list,integer,list,lista)
clauses
    repl([],A,B,[]):-!.
    repl([C|L],A,B,**[l(|L1])**:- C=A,repl(L,A,B,L1),!.
    repl([C|L],A,B,[i(C)|L1]):- repl(L,A,B,L1),!.

感谢您的帮助,解决了问题(使用dasblinkenlight代码)

1 个答案:

答案 0 :(得分:1)

试试这个:

concat([],L,L).
concat([H|T],L,[H|Res]) :- concat(T,L,Res).

repl([],_,_,[]).
repl([Val|T],Val,Repl,Res) :- repl(T,Val,Repl,Temp), concat(Repl,Temp,Res).
repl([H|T],Val,Repl,[H|Res]) :- repl(T,Val,Repl,Res).

我不知道它是否适用于Turbo Prolog,但它在SWI中运行良好,并且它不使用任何内置谓词。

concat/3对规则将位置1和位置2中的列表连接到位置3的结果列表中。

  • 第一个repl处理空列表;它与你的相同,除了它用下划线替换单个变量(强烈推荐的做法)
  • 第二条规则处理被替换的值Val位于列表首部的情况;它替换了尾部的值,并将替换列表Repl与替换Res的结果连接起来。
  • 最后一条规则处理头部值与Val不匹配时的情况。它向下递减一级,并将初始列表的头部添加到替换结果的头部。

作为旁注,切割操作符!很少需要。如果遇到这个问题,你绝对可以不用它。