Prolog Question - 将元素数组转换为一组元素

时间:2010-09-09 07:58:43

标签: prolog

我正在尝试编写一个谓词来将元素数组转换为一组元素。为了做到这一点,我在swi-prolog中创建了以下谓词:

sterge(_, [], []).

sterge(A, [A|L], New):-
    sterge(A, L, New).

sterge(A, [B|L], [B|New]):-
 A \= B,
 sterge(A, L, New).

multime(A, New):-
 mult(A, [], New).

mult([], A, A).

mult([A|L], [A|T], New):-
 sterge(A, L, L1),
 mult(L1, T, New).

如您所见,sterge谓词有3个参数。其主要目的是将A元素的所有外观删除到L列表中,从而生成不包含任何New元素的A列表。

在这个谓词的帮助下,我试图逐个删除列表中的所有元素,包括它们的所有外观并将它们添加到一个新列表中,该列表包含给定数组元素的单个副本,需要转换成一组元素。

mult谓词有3个参数。

第一个参数是必须转换为集合的给定数组。

第二个参数是一个缓冲区列表,用于在执行谓词期间逐个包含数组的唯一元素。

第三个参数用于返回完整的参数集。

实际上,当给定数组(第一个参数)为null([])时,我希望第三个参数与第二个参数的值统一。

最后,带有两个参数的multime谓词(给定数组和所需的集合)启动对mult谓词的调用,其参数的值如下。对于第一个参数,它采用给定数组,对于第二个参数,空列表([]),对于第三个参数,需要获取所需的元素集。

但是,当我发起对multime谓词的调用时,我始终会收到false结果。你能告诉我哪里出错了吗?

1 个答案:

答案 0 :(得分:2)

mult的遗体被破坏了。

mult([A|L], [A|T], New):-
 sterge(A, L, L1),
 mult(L1, T, New).

您正在拆分第一个参数AND和第二个参数的列表。从mult调用multime,并将空列表作为第二个参数。空列表无法拆分,因此谓词无法匹配。这就是为什么你得到false

这是固定代码

mult([A|L], T, New):-
  sterge(A, L, L1),
  mult(L1, [A|T], New).

列表连接是在对mult的递归调用中完成的。当L1是空列表时,递归将结束,并且将通过New变量返回连接列表。注意:新列表将按相反的顺序排列。