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

试试这个:

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中工作得很好,而且它不使用任何内置谓词。

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

  • 第一个repl处理进入的空列表;它与您的完全相同,只是用下划线替换了singleton变量(强烈建议这样做)
  • 第二条规则处理被替换的值Val位于列表的开头的情况;它替换尾部中的值并且将替换列表Repl与替换Res的结果连接起来
  • 最后一条规则处理头值与Val不匹配的情况。它向下递归一个级别,并将初始列表的头置于替换结果的头之前

作为一个旁注,割算子!很少是必要的。如果遇到这个问题,你绝对可以不用它

相关内容

  • 没有找到相关文章

最新更新