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

问题描述:

*嗨,我试图用另一个列表替换列表中的一个元素,并且当turbo prolog给我语法错误时im卡住,如果C = A->放入结果列表(L1)替换元素的列表。Prolog用另一个列表替换列表中的元素

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代码)

+0

在第三次报价我试图把列表L1(谁的类型是元素),在它的头部,所有列表B(谁是元素的替代)。 – user1741409

+0

这是一个普通的语法错误,正如所报道的“语法错误”事实所表明的那样。 提示:[l(| L1] – NotAUser

试试这个:

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不匹配的情况。它递归下降一级,并且将最初列表的头部预先置换到替换结果的头部。

作为一个附注,切割运算符!是很少需要的。在这个问题的情况下,你绝对可以没有它。

+0

您的绅士。非常感谢您的帮助,作品完美。 – user1741409