小编Jon*_*tan的帖子

如何在Prolog中找到集合的基数?

我试图在 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
Run Code Online (Sandbox Code Playgroud)

但正确的答案是 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.
Run Code Online (Sandbox Code Playgroud)

但是当您查询时会生成无限循环。有人可以帮我解决这个问题吗?谁能帮我解决这个问题,我该如何编写 prolog 语句?

编辑 附件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]
Run Code Online (Sandbox Code Playgroud)

prolog

3
推荐指数
1
解决办法
487
查看次数

标签 统计

prolog ×1