List Prolog-识别变量的子列表

List Prolog-识别变量的子列表,list,prolog,List,Prolog,我有一项任务,在该任务中,我必须完成以下任务-列出如下清单: List=[[uu,$,,\ uu,,uu,,$,$]。 我必须用pred(List,Sub)编写一个谓词pred/2,这样它是true当且仅当Sub是一个大小>=2的子列表,没有相邻变量,其中没有任何成员是$。示例: List=[X,Y,$,p,Q,R,S,$,A,$],pred(List[X,Y])应该成功 List=[X,Y,$,p,Q,R,S,$,A,$],pred(List[p,Q,R])不应成功,因为S与p,Q,R相邻 L

我有一项任务,在该任务中,我必须完成以下任务-列出如下清单:

List=[[uu,$,,\ uu,,uu,,$,$]。

我必须用
pred(List,Sub)
编写一个谓词
pred/2
,这样它是
true
当且仅当
Sub
是一个大小>=2的子列表,没有相邻变量,其中没有任何成员是
$
。示例:

List=[X,Y,$,p,Q,R,S,$,A,$],pred(List[X,Y])
应该成功

List=[X,Y,$,p,Q,R,S,$,A,$],pred(List[p,Q,R])
不应成功,因为
S
p,Q,R
相邻

List=[X,Y,$,p,Q,R,S,$,A,$],pred(List[p,Q,R,S])
应该成功

List=[X,Y,$,p,Q,R,S,$,A,$],pred(List,[A,$])
不应成功,因为它包含一个
$

我已经编写了以下代码,根据一些测试,这些代码符合我的要求:

pred(List, Sub) :- pred(List, Sub, []).
pred([], Sub, Sub) :- length(Sub, Len),
                             Len >= 2.
pred([H|T], Sub, Aux) :- H \== $, !,
                                  append(Aux, [H], New), 
                                  pred(T, Sub, New).
pred([$|_], Sub, Sub):- length(Sub, Len), Len >= 2.
pred([$|T], Sub, _) :- pred(T, Sub, []).
然而,我觉得这个解决方案很简单。虽然我知道StackOverflow通常用于人们不能做的事情,但我真的觉得我已经为一个简单的问题想出了一个相当复杂的解决方案,并且想知道一个更好的方法来实现我想要的


提前谢谢你

append/2是库(列表)中一个方便的谓词。它允许更容易地实现要求:

pred(L,S):-
附加([X,S,Y],L),
长度(S,C),C>=2,
地图列表(\==($),S),
(X=[];最后(X,X),X==$),
(Y=[];Y=[Y|||,Y|==$)。

不要考虑“应评估为真”或“应评估为假”。从成功或失败的角度考虑,这是一个很好的建议。命令式编程习惯很难坚持。您知道,
[\uu,\uu,$,\u,\ u,\ u,$,\ u,$]
是一个匿名变量列表,带有一个偶然的
$
?它不是一个非变量的列表。当你写
list=[X,Y,$,P,Q,R,s,$,a,$],pred(list,[X,Y])
打算使用变量,或者应该让你用原子来写它,比如
list=[X,Y,$,P,Q,R,s,$,a,$],pred(list,[X,Y])
?您的代码示例显示您想要原子。这正是我要找的!谢谢:)