将整数列表与数字序言进行比较
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]
?
会发生什么
我必须定义一个谓词,它将一个整数列表作为输入,并用小于 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]
?