在列表中查找单词并将其删除

时间:2017-06-30 16:14:19

标签: prolog

我需要在char列表中找到一个Word并从中删除它。

谓词 ocurre([List],[Word],[CleanList])

[List] is a list of elements for example [a,b,c,d].
[Word] contains in a list the word that I must find in List for example [b,c]
[CleanList] return List with out Word (in the example [a,d])

该计划是:

ocurre([X|LS],[X|P],Aux):- ocurre(LS,P,Aux),!.
ocurre([X|LS],[Y|P],Aux):- concatenar(Aux,[X],Aux2),
                           ocurre(LS,[Y|P],Aux2).
ocurre([],[],Aux):-!.
ocurre([],P,Aux):-!.
ocurre(LS,[],[Aux|LS]):-!.


concatenar([],X,X):-!.
concatenar([X|Y],R,[X|M]):- concatenar(Y,R,M).

所以,当我咨询ocurre([a,b,c,d] , [b,c] , L).我的程序返回L=[]时,它必须返回L=[a,d]。我不知道它错了什么。感谢您的帮助

2 个答案:

答案 0 :(得分:2)

首先,你可以摆脱所有无用的切割操作符。您可以在不削减的情况下重写程序,也不需要concatenar/3谓词:

ocurre([],_,[]).
ocurre([H|T],[],[H|T]).
ocurre([X|LS],[X|P],Aux):- ocurre(LS,P,Aux).
ocurre([X|LS],[Y|P],[X|Aux]):- dif(X,Y),ocurre(LS,[Y|P],Aux).

示例:

?- ocurre([a,b,c,d] , [b,c] , L).
L = [a, d] ;
false.

您的实现问题首先是基本情况,您只需要上面两个基本情况用于清空第一个列表和清空第一个第二个列表,所有其他情况都包含在递归中。

另外,我理解你要做的是当你在第三个列表中找到要添加的元素时,将第三个列表与新列表连接起来并作为新参数传递。在这种情况下,您使用第三个列表作为累加器,您需要在开始时将其初始化为空列表。因此,不是所有这些都可以在递归期间实例化第三个list-Result,例如规则:

ocurre([X|LS],[Y|P],[X|Aux]):- dif(X,Y),ocurre(LS,[Y|P],Aux).

简单说如果X和Y与列表的其余部分调用ocurre不同,例如LS和第二个列表[Y | P],你已经实例化了第三个列表的当前第一个元素:[X | Aux]和X继续其余的,例如Aux。

答案 1 :(得分:0)

基于库(http://www.pappu-lighting.com/Series/Kutiq/LAST.html)的替代方案:

?- [user].
ocurre(List,Word,CleanList) :-
|:       append([Left,Word,Right], List),
|:       append(Left,Right,CleanList).
|: 
|: ^Dtrue.

?- ocurre([a,b,c,d] , [b,c] , L).
L = [a, d] ;
false.