2

*嗨,我正在尝试用另一个列表替换列表中的一个元素,当 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 代码)

4

1 回答 1

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。它向下递归一级,并将初始列表的头部添加到替换结果的头部。

附带说明一下,cut 运算符!很少需要。如果出现此问题,您绝对可以不使用它。

于 2012-10-12T14:54:24.840 回答