gpt4 book ai didi

prolog - 计算Prolog中一个列表中出现次数的方法

转载 作者:行者123 更新时间:2023-12-03 20:00:24 25 4
gpt4 key购买 nike

我必须编写一种方法来计算一个列表从另一个给定列表中出现的次数。例如:

?-reps([a,b,c,a,b,c],[a,b,c],0,R). 
R = 2 ? ;
no
我试图编码它:
incr(X, X1) :-
X1 is X+1.

reps([],[],C,D):-
incr(C,D).
reps(_,[],C,D):-
incr(C,D),
!.
reps([X|A],[X|B],C,D):-
reps(A,B,C,D),
reps(A,B,C,D).
我的主要问题是,我可以第一次比较,但第二次我的“比较列表”现在是空的,我无法比较列表的其余部分。
有没有办法制作一个可以存储“比较列表”的全局变量来调用它?

最佳答案

正如@false 在我的其他答案中的评论中所建议的,pure solution也接受一般查询,这将是可取的。以下解决方案还允许查找特定长度的所有重复模式,或其他更一般的模式:findPatterns收集所有可能的模式以在输入列表中搜索。 reps/5和以前一样,在输入字符串中查找模式的匹配项数。但是,此版本也可以处理不属于该模式的任何内容。 reps/3 ,最后,检查是否 P是在 L 中可以找到的模式之一如果是,则检索其计数。

findPatterns([],[]).
findPatterns([H|T],L) :- findall(P, (P=[_|_],append(P,_,[H|T])),Patterns),
findPatterns(T,L1),
append(Patterns, L1,L).

startNoMatch(_,[]):- false.
startNoMatch([X1|T1],[X2|T2]) :- dif(X1,X2); startNoMatch(T1,T2).

reps(L,P,C,C) :- length(L,L1), length(P,L2), L1 < L2.
reps(L,P,C,D):- append(P,R,L),C1 is C+1, reps(R,P,C1,D).
reps([H|T],P,C,D):- startNoMatch([H|T],P),reps(T,P,C,D).

reps(L,P,C) :- findPatterns(L,Patterns),
list_to_set(Patterns,PSet),
(member(P,PSet), reps(L,P,0,C); \+ member(P,PSet), C=0).
查询:
?- reps([a,b,c,a,b,c],[a,b,c],R).
R = 2 ; false.

?- reps([a,b,c,a,b,c],X,2).
X = [a] ;
X = [a, b] ;
...

?- reps([a,B],[B],2).
B = a ; false.

?- reps([a,B],[B],1).
dif(B, a) ; false.
从上次查询中可以看出, dif/2延迟目标,以便 B 的查询的其他部分可能会成功与 a 不同的 s .

关于prolog - 计算Prolog中一个列表中出现次数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67568087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com