我想将由整数分隔的单词列表拆分为列表列表。

示例查询和预期结果:

?- separatewords([h,e,l,l,o,1,o,v,e,r,3,t,h,e,r,e], X).
X = [[h,e,l,l,o],[o,v,e,r],[t,h,e,r,e]].


我已经实现以下目标:
将列表拆分为第一个整数之前的一个列表和第一个整数之后的一个列表:

结果查询样例:

?- take1word([h,e,l,l,o,1,o,v,e,r,3,t,h,e,r,e], X, Y).
X = [h,e,l,l,o], Y = [o,v,e,r,3,t,h,e,r,e].                 % OK


我的代码:

 take1word([H|T],[],T) :-
    integer(H).
 take1word([H|T],[H|Hs],Y) :-
    (  float(H), take1word(T,Hs,Y)
    ;  atom(H), take1word(T,Hs,Y)
    ).


为了分隔单词,我的代码如下:

 separatewords([],[]).
 separatewords([H|T],L) :-  separatewords(T,[take1word([H|T],)|L]).


结果只会给我false,但我不知道我在做什么错。

最佳答案

您在take1word/3上遇到问题:如果列表中有整数,它将使用一个单词,但不会使用最后一个单词。您需要为其添加另一个基本子句:

take1word([], [], []).
take1word([H|T],[],T) :- integer(H).
take1word([H|T],[H|Hs],Y) :- float(H), take1word(T,Hs,Y); atom(H), take1word(T,Hs,Y).


现在,您的separatewords/2将起作用:

separatewords([],[]).
separatewords(L, [W|T]) :- take1word(L,W,R), separatewords(R,T).


Demo.

10-05 17:44