一遍又一遍地给出相同的答案,而不是听众崩溃 - Prolog

时间:2010-12-03 10:10:58

标签: prolog

警告,我对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] ;
听众在第四次尝试时崩溃。

1 个答案:

答案 0 :(得分:2)

我建议你以另一种方式解决这个问题:

  • 像你一样定义一个递归谓词(split / 4),检查输入列表中的每个项目,但是在递归返回时构建结果列表(也就是说,将当前项目添加为相应列表的头部)该条款的负责人)。

这将是这样的:

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).