从事prolog任务.
我有一个结构 cnt(letter,number).
我需要返回一个列表,cnt其中每个cnt字符的出现次数(假设每个项目已经被排序以将相同的项目一个接一个地放置).
到目前为止我有这个:
cnt(letter,number).
freq([],[]).
freq([A|L],Y) :- grab(A,Init,_), freq(L,[Init|Y]).
Run Code Online (Sandbox Code Playgroud)
抓取工作正确获取项目列表并返回第一个重复项列表 Init
例如,grab([a,a,a,b,c], Init, Rest).将返回Init = [a,a,a].
假设我有一个列表,[a,a,a,b,b,b,c,c]我需要freq返回Y = [cnt(a,3), cnt(b,3), cnt(c,2)].
我认为到目前为止我所接近的是正确的,除了它返回false.
反正有没有办法看看它到底做了什么?或者任何人都可以看到任何明显的问
让我们从你的定义开始,这已经非常接近你想要的了.
freq([],[]).
freq([A|L],Y) :- grab(A,Init,_), freq(L,[Init|Y]).
Run Code Online (Sandbox Code Playgroud)
freq/2这里为列表的每个元素定义了一些东西.为了看到这个,我将看看你定义的以下部分:
freq([],_).
freq([A|L],_) :- ..., freq(L,_).
Run Code Online (Sandbox Code Playgroud)
这是你想要的吗?您说该列表仅包含相同的元素.所以,如果我们有[a,a]你希望这个freq/2应用一次,而不是两次.
另一个问题是这个.同样,我只关注你的计划的一部分:
freq(_,[]).
freq(_,Y) :- ..., freq(_,[Init|Y]).
Run Code Online (Sandbox Code Playgroud)
所以你在这里有一个目标freq(_,[Init|Y]),其中包含第二个参数中至少一个元素的列表.您是否在定义中看到适用于此类列表的任何条款?事实freq(_,[]).永远不会适用,所以剩下的唯一规则是这个目标出现的规则.总之,目标freq(_,[Init|Y])永远不会成功.不管是什么Init和Y有.
现在是您的更正版本,几乎是您想要的:
freq([],[]).
freq([A|L],[As|Y]) :-
grab([A|L],As,K),
freq(K,Y).
Run Code Online (Sandbox Code Playgroud)
让我们来看看:
?- freq([a,a,a,b,b,b,c,c],Ys).
Ys = [[a,a,a],[b,b],[c,c]].
Run Code Online (Sandbox Code Playgroud)
因此,我们需要一个cnt(a,3)具有列表的字符和长度的结构,而不是列表中的那些元素.
freq([],[]).
freq([A|L],[cnt(A,N)|Y]) :-
grab([A|L],As,K),
length(As, N),
freq(K,Y).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
951 次 |
| 最近记录: |