Prolog 序言-检查项目是否位于列表的右/左/中间

Prolog 序言-检查项目是否位于列表的右/左/中间,prolog,Prolog,我必须弄清楚如何找出该项目是否位于列表中其他两个项目之间。我的想法是让一个somewhereleft和somewhereright函数,然后以somewherebeen(X,Y,Z,L)的方式使用它:somewhereleft(X,Y,L),somewhereright(Y,Z,L)。我已经实现了一个函数来确定项目是否在右边right(X,Y,[X,Y |))。右(X,Y,T):-右(X,Y,T)。和左左(X,Y,L):-右(Y,X,L)。;但是,我无法找到递归的somewhereleft/ri

我必须弄清楚如何找出该项目是否位于列表中其他两个项目之间。我的想法是让一个
somewhereleft
somewhereright
函数,然后以
somewherebeen(X,Y,Z,L)的方式使用它:somewhereleft(X,Y,L),somewhereright(Y,Z,L)
。我已经实现了一个函数来确定项目是否在右边
right(X,Y,[X,Y |))。右(X,Y,T):-右(X,Y,T)。
和左
左(X,Y,L):-右(Y,X,L)。
;但是,我无法找到递归的
somewhereleft/right
函数。

append/3可能是你的朋友

in_order(X, Y, Z, Lst) :-
    append(_, [X|T1], Lst),
    append(_, [Y|T2], T1),
    append(_, [Z|_], T2).
比如说

?- in_order(a,b,c,[a,e,b,d,c]).
true .
但是


如果
L=[c,b,a,b,c,b,a]
呢?
在(a,c,b,L)之间的某个地方应该成功还是失败?它满足了我的需要,但是你能不能快速解释一下为什么它会起作用?我尝试使用
trace
,但信息量不大。第一个append在Lst中找到一个以X开头的列表,我们只对列表的其余部分T1感兴趣。符号“u”表示我们对X之前的所有元素都不感兴趣。第二个追加在T1中找到一个以Y开头的列表,我们只对其余的T2感兴趣,最后我们在T2中搜索一个Z,(我们可以编写成员(Z,T2))。
?- in_order(a,b,c,[c,b,a,b,c,b,a]).
true ;
false.