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代码)
答
试试这个:
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
在第三次报价我试图把列表L1(谁的类型是元素),在它的头部,所有列表B(谁是元素的替代)。 – user1741409
这是一个普通的语法错误,正如所报道的“语法错误”事实所表明的那样。 提示:[l(| L1] – NotAUser