【发布时间】:2016-04-28 06:26:17
【问题描述】:
我试图在 Prolog 中找到一个集合的基数。众所周知,一个集合不能有重复的元素。我试过了。
cardinal([], 0).
cardinal([_|Tail], N):-
removeRepeated(Tail, ListWithoutRepeated),
cardinal(ListWithoutRepeated, N1),
N is N1 + 1.
----------------------------------------------------
consult:
?- cardinal([1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5], N).
N = 6
但正确答案是 N = 5。显然,我只计算尾部的项目,如果头部在尾部重复,则忽略。 所以我尝试了这样的事情。即头尾相加,重复上述过程。
join([], L, [L]).
join([Head|Tail], L, [Head|Tail2]):-
join(Tail,L, Tail2).
cardinal([], 0).
cardinal([Head|Tail], N):-
join(Tail,Head, List),
removeRepeated(List, ListWithoutRepeated),
cardinal(ListWithoutRepeated, N1),
N is N1 + 1.
但是当您查询时,会生成一个无限循环。 有人可以帮我解决这个问题吗 任何人都可以帮助我如何为此编写序言语句?
编辑
附removeRepeated
removeRepeated([],[]).
removeRepeated([Head|Tail],ListWithoutRepeated):-
member(Head,Tail),
!,
removeRepeated(Tail,ListWithoutRepeated).
removeRepeated([Head|Tail],[Head|ListWithoutRepeated]):-
removeRepeated(Tail,ListWithoutRepeated).
----------------------------------------------------
consult:
?- removeRepeated([1,1,1,1,2,2,2,3,3,3,4,4,4,8], N).
N = [1, 2, 3, 4, 8]
【问题讨论】:
-
你能展示一下
removeRepeated的实现吗? -
“不能”是什么意思?也许“不能拥有”?
标签: prolog