Prolog中结果的形式
我的问题是关于f(1,3)的形式,我不太明白这一点。我应该怎么做,然后Prolog中的输出形式是f()。 谢谢 形式为Prolog中结果的形式,prolog,Prolog,我的问题是关于f(1,3)的形式,我不太明白这一点。我应该怎么做,然后Prolog中的输出形式是f()。 谢谢 形式为f(X,N)的术语表示项目X具有频率N。给定一个项目X和一个频率列表F,以下谓词更新F,以计算X的出现次数,从而生成一个新的频率列表G: ?− count_frequencies ([1 ,1 ,4 ,6 ,8 ,8 ,6 ,2 ,1] , L). L = [f(1,3),f(4,1),f(6,2),f(8,2),f(2,1)] 运行示例: count(X, [], [f(X
f(X,N)
的术语表示项目X
具有频率N
。给定一个项目X
和一个频率列表F
,以下谓词更新F
,以计算X
的出现次数,从而生成一个新的频率列表G
:
?− count_frequencies ([1 ,1 ,4 ,6 ,8 ,8 ,6 ,2 ,1] , L).
L = [f(1,3),f(4,1),f(6,2),f(8,2),f(2,1)]
运行示例:
count(X, [], [f(X,1)]). % add new term
count(X, [f(X,N)|F], [f(X,M)|F]) :- M is N+1. % update existing term
count(X, [f(Y,N)|F], [f(Y,N)|G]) :- X\=Y, count(X, F, G). % continue searching
count_frequencies(Items, Frequencies) :-
loop(Items, [], Frequencies).
loop([], Accumulator, Accumulator).
loop([Item|Items], Accumulator, Frequencies) :-
count(Item, Accumulator, NewAccumulator),
loop(Items, NewAccumulator, Frequencies).
another_count_frequencies(Items, Frequencies) :-
foldl(count, Items, [], Frequencies).
现在,您可以使用谓词count/3
定义谓词count\u频率/2
,如下所示:
?- count(4,[],A), count(5,A,B), count(4,B,C), count(6,C,D), count(5,D,E), count(4,E,F).
A = [f(4, 1)],
B = [f(4, 1), f(5, 1)],
C = [f(4, 2), f(5, 1)],
D = [f(4, 2), f(5, 1), f(6, 1)],
E = [f(4, 2), f(5, 2), f(6, 1)],
F = [f(4, 3), f(5, 2), f(6, 1)] .
?- count_frequencies([1 ,1 ,4 ,6 ,8 ,8 ,6 ,2 ,1] , L).
L = [f(1, 3), f(4, 1), f(6, 2), f(8, 2), f(2, 1)] ;
false.
运行示例:
count(X, [], [f(X,1)]). % add new term
count(X, [f(X,N)|F], [f(X,M)|F]) :- M is N+1. % update existing term
count(X, [f(Y,N)|F], [f(Y,N)|G]) :- X\=Y, count(X, F, G). % continue searching
count_frequencies(Items, Frequencies) :-
loop(Items, [], Frequencies).
loop([], Accumulator, Accumulator).
loop([Item|Items], Accumulator, Frequencies) :-
count(Item, Accumulator, NewAccumulator),
loop(Items, NewAccumulator, Frequencies).
another_count_frequencies(Items, Frequencies) :-
foldl(count, Items, [], Frequencies).
或者,在SWI Prolog中,您还可以使用谓词定义谓词的更简明版本count\u frequencies/2
,如下所示:
?- count(4,[],A), count(5,A,B), count(4,B,C), count(6,C,D), count(5,D,E), count(4,E,F).
A = [f(4, 1)],
B = [f(4, 1), f(5, 1)],
C = [f(4, 2), f(5, 1)],
D = [f(4, 2), f(5, 1), f(6, 1)],
E = [f(4, 2), f(5, 2), f(6, 1)],
F = [f(4, 3), f(5, 2), f(6, 1)] .
?- count_frequencies([1 ,1 ,4 ,6 ,8 ,8 ,6 ,2 ,1] , L).
L = [f(1, 3), f(4, 1), f(6, 2), f(8, 2), f(2, 1)] ;
false.
运行示例:
count(X, [], [f(X,1)]). % add new term
count(X, [f(X,N)|F], [f(X,M)|F]) :- M is N+1. % update existing term
count(X, [f(Y,N)|F], [f(Y,N)|G]) :- X\=Y, count(X, F, G). % continue searching
count_frequencies(Items, Frequencies) :-
loop(Items, [], Frequencies).
loop([], Accumulator, Accumulator).
loop([Item|Items], Accumulator, Frequencies) :-
count(Item, Accumulator, NewAccumulator),
loop(Items, NewAccumulator, Frequencies).
another_count_frequencies(Items, Frequencies) :-
foldl(count, Items, [], Frequencies).
谢谢,实际上我只需要f(1,3)的形式。但还是要谢谢你