警告,我对Prolog很新。
我在Prolog中写了一个分裂谓词。它将列表拆分为两个新列表。一个包含大于Key的项,另一个包含小于或等于Key的项。它应该只返回一组答案。问题是如果我输入;检查更多的答案,它不断给我我已经得到的答案,然后最终听众崩溃。我想知道你是否可以帮我解决这个问题?
代码:
split([],_,[],[]).
split([H|T],Key,Small,Big):-
H=<Key,
removeFirst(Small,H,NewSmall),
split(T,Key,NewSmall,Big).
split([H|T],Key,Small,Big):-
H>Key,
removeFirst(Big,H,NewBig),
split(T,Key,Small,NewBig).
removeFirst([H|T],H,T).
removeFirst(L,Key,Result):-
divide(L,Key,F,E),
X = F,
Y = E,
append(X,Y,Z),
Result = Z.
输出:
?- split([1,2,3,4,5],3,S,B).
S = [1, 2, 3]
B = [4, 5] ;
S = [1, 2, 3]
B = [4, 5] ;
S = [1, 2, 3]
B = [4, 5] ;
听众在第四次尝试时崩溃。
答案 0 :(得分:2)
我建议你以另一种方式解决这个问题:
这将是这样的:
split([], _, [], []). % Base case
split([Item|Tail], Key, [Item|Small], Big):-
Item =< Key,
!, % Optimization, the cut here is to avoid the comparison in the next clause
split(Tail, Key, Small, Big).
split([Item|Tail], Key, Small, [Item|Big]):-
split(Tail, Key, Small, Big).