Prolog中结果的形式

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(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,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)的形式。但还是要谢谢你