Prolog 一次又一次地给出相同的答案,听众就会崩溃-序言

Prolog 一次又一次地给出相同的答案,听众就会崩溃-序言,prolog,Prolog,警告,我对Prolog还很陌生 我已经在Prolog中编写了一个拆分谓词。它将一个列表拆分为两个新列表。一个包含大于键的项,另一个包含小于或等于键的项。它应该只返回一组答案。问题是如果我打字;为了检查更多的答案,它不断地给我已经得到的答案,然后最终听众崩溃了。我想知道你是否能帮我解决这个问题 代码: split([],[uu],[],[])。 拆分([H | T],键,小,大):- H=键, 移除第一个(大的、H的、新的), 拆分(T、键、小、新比格)。 首先移除([H | T],H,T)。 r

警告,我对Prolog还很陌生

我已经在Prolog中编写了一个拆分谓词。它将一个列表拆分为两个新列表。一个包含大于键的项,另一个包含小于或等于键的项。它应该只返回一组答案。问题是如果我打字;为了检查更多的答案,它不断地给我已经得到的答案,然后最终听众崩溃了。我想知道你是否能帮我解决这个问题

代码:

split([],[uu],[],[])。
拆分([H | T],键,小,大):-
H=键,
移除第一个(大的、H的、新的),
拆分(T、键、小、新比格)。
首先移除([H | T],H,T)。
removeFirst(L、键、结果):-
除法(L,键,F,E),
X=F,
Y=E,
附加(X,Y,Z),
结果=Z。
输出:

?-拆分([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]

侦听器在第4次尝试时崩溃

我建议您以另一种方式解决此算法:

  • 像您所做的那样定义递归谓词(split/4),检查输入列表中的每个项,但在递归返回时构建结果列表(即,将当前项添加为子句头上相应列表的头)
应该是这样的:

split([], _, [], []).  % Base case
split([Item|Tail], Key, [Item|Small], Big):-
  Item =< Key,
  split(Tail, Key, Small, Big).
split([Item|Tail], Key, Small, [Item|Big]):-
  Item > Key,
  split(Tail, Key, Small, Big).
split([]、[uuu]、[]、[])。%基本情况
拆分([项目|尾]、键、[项目|小]、大):-
Item=关键点,
分裂(尾巴、钥匙、小的、大的)。

+1;这就是我写这样一个谓词的方法。如果您不想使用cut(
)来获得纯度,只需将测试
项>键
作为
split/4
最后一个子句的第一个子目标就足够了,就像OP最初所做的那样。
split([1],1,[1],Grs)。
成功,
split([1],1],Grs)。
错误。
split([], _, [], []).  % Base case
split([Item|Tail], Key, [Item|Small], Big):-
  Item =< Key,
  split(Tail, Key, Small, Big).
split([Item|Tail], Key, Small, [Item|Big]):-
  Item > Key,
  split(Tail, Key, Small, Big).