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.