将整数列表与数字序言进行比较

Comparing a list of integers with a number 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]?

会发生什么