将整数列表与数字prolog进行比较



我必须定义一个谓词,该谓词以整数列表为输入,并用小于10的L元素实例化X,用大于或等于10的列表元素实例化Y。

这是谓词:separate(L, X, Y)

以下是我正在寻找的输出的一些示例:

?− separate([2, 13, 4, 0, 55], X, Y).
X = [2, 4, 0]
Y = [13, 55]
?− separate([2, 3], X, Y).
X = [2, 3]
Y = [ ]

非常简单。这里有一个没有内置谓词的解决方案:

separate([],[],[]).
separate([H|T],LG,LL):-
( H > 10 -> 
LG = [H|TG],
separate(T,TG,LL) ;
LL = [H|TL],
separate(T,LG,TL)
).
?- separate([2, 13, 4, 0, 55], X, Y).
X = [13, 55],
Y = [2, 4, 0]
?- separate([2, 3], X, Y).
X = [],
Y = [2, 3]

我会把它分解成多个子句:

separate( []     , []     , []     ) .
separate( [X|Xs] , [X|Ys] ,    Zs  ) :- X <  10, separate(Xs,Ys,Zs).
separate( [X|Xs] ,    Ys  , [X|Zs] ) :- X >= 10, separate(Xs,Ys,Zs).

更易于阅读。更好地表达意图,同时不要对列表的内容做出假设——例如,[1,12,3,x,9,28]会发生什么?

最新更新