*嗨,我正在尝试用另一个列表替换列表中的元素,并且当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代码)
答案 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
不匹配时的情况。它向下递减一级,并将初始列表的头部添加到替换结果的头部。作为旁注,切割操作符!
很少需要。如果遇到这个问题,你绝对可以不用它。