我阻止谓词编码 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]
...
非常感谢!
答案 0 :(得分:4)
假设您X=[a,b], X=[b,c], X=[c,d] ....
实际上是指
X=[a,b] ; X=[b,c] ; X=[c,d] ; ...
,这是使用Prolog的dcg - 形式主义的解决方案:
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)).