首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在列表中查找唯一元素的数量

在列表中查找唯一元素的数量
EN

Stack Overflow用户
提问于 2021-03-13 15:01:38
回答 1查看 83关注 0票数 2

我想要写一个代码,它将返回列表中唯一元素的数量。我的想法是检查单子表的头是否在单位表的列表中。如果不是,则将其添加到列表中并增加计数器,然后继续保留其余的列表。所以,我尝试了如下:

代码语言:javascript
运行
复制
count([],0).
count([X,T], N) :- 
    count([X,T], [], N). %initially list of unique elements is empty

count([X,T], U, N) :- % U is a list of unique elements
    (not(member(X, U)), append(U, X, U2));
    count(T, U2, N1),
    N is N1 + 1.

%------ helpers ------
member_(X,[Y|T]):-
    member_(X, T).
member_(X,[X|_]).

append([], Y, [Y]).  % append[] and Y to get Y.
append([H|X], Y, [H|Z]) :- append(X, Y, Z). % append [H|X] and Y to get [H|Z] if appending X and Y gives Z

但是运行在上面只返回false

代码语言:javascript
运行
复制
3 ?- count([1,2,3],N).
   Call: (10) count([1, 2, 3], _7714) ? creep
   Fail: (10) count([1, 2, 3], _7714) ? creep
false.

为何会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-13 15:20:09

,但在上面运行,只需返回false:

3 ?-计数(1,2,3,N)。呼叫:(10)计数(1,2,3,_7714)?蠕变失败:(10)计数(1,2,3,_7714)?爬错了。

为何会这样呢?

因为没有一个count([1,2,3],N)可以匹配的子句的头。

对于count/2您有两个子句:

代码语言:javascript
运行
复制
count([],0).             %%% clause 1
count([X,T], N) :- ...   %%% clause 2

由于[1,2,3]不能与[]统一,所以第1条是不匹配的。但是[1,2,3]也不能与[X,T]统一,因此第2条也是不匹配的。因此,count([1,2,3],N)无法被证明。

你可以通过问

代码语言:javascript
运行
复制
?- [X,T]=[1,2,3].
false.

您需要递归地分解任意长度的列表,而不是[X|T]。(请测试?- [X|T]=[1,2,3].,看看如何修复代码。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66614927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档