我正在尝试编写一个谓词来将元素数组转换为一组元素。为了做到这一点,我在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
结果。你能告诉我哪里出错了吗?
答案 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
变量返回连接列表。注意:新列表将按相反的顺序排列。