列表中的连续元素

时间:2014-06-08 13:13:00

标签: prolog dcg

我阻止谓词编码 Prolog 。我需要编写两个谓词的代码:

如果我致电:u([a,b,c,d,e,f], X).,则会X=[a,b], X=[b,c], X=[c,d] ...

如果我致电:v([a,b,c,d,e,f], X).,则会X=[a,b], X=[c,d], X=[e,f] ...

非常感谢!

3 个答案:

答案 0 :(得分:4)

假设您X=[a,b], X=[b,c], X=[c,d] ....实际上是指 X=[a,b] ; X=[b,c] ; X=[c,d] ; ...,这是使用Prolog的 - 形式主义的解决方案:

u(Xs, [X,Y]) :-
   phrase(( ..., [X,Y], ... ), Xs).

... --> [] | [_], ... .

v(Xs, [X,Y]) :-
   phrase(( evenell, [X,Y], ...), Xs).

evenell --> [] | [_,_], evenell.

答案 1 :(得分:4)

虽然false的答案更优雅,但这里的解决方案更适合谓词u/2的初学者。

u([X,Y|_], [X,Y]).
u([_|Tail], XY):- u(Tail,XY).

第一条规则是[X,Y]表示列表中的两个连续元素,如果它们是该列表中的前两个元素。

第二条规则规定,如果两个元素在列表尾部的某个位置是连续的,则它们在列表中是连续的。

现在尝试为v/2找到类似的解决方案。

答案 2 :(得分:2)

我认为你应该使用追加:

u(L, [A,B]) :-
    append(_, [A,B|_], L).


v(L, X) :-
     append([A,B], L1,L),
    (   X = [A,B]; v(L1, X)).