*嗨,我正试图用另一个列表替换列表中的一个元素,当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
不匹配的情况。它向下递归一个级别,并将初始列表的头置于替换结果的头之前
作为一个旁注,割算子!
很少是必要的。如果遇到这个问题,你绝对可以不用它