-1

我怎么解决这个问题??

输入:count_atoms(T,Count)

输出 count_atoms(a(b,c(d,e),f),Count)。计数 = 4 ;

我真的不知道......请你能帮帮我吗?

4

2 回答 2

1

通过 SWI-Prolog 和递归使用库(聚合):

count_atoms(T, Count) :-
       atom(T)
    -> Count = 1
    ;  compound(T)
    -> aggregate_all(sum(C), (arg(_, T, A), count_atoms(A, C)), Count)
    ;  Count = 0
    .

测试:

?- count_atoms(a(b,c(1,e),f),Count).
Count = 3.

但我担心这不是您分配的解决方案。对于更基本的东西,您可以使用=..分解任何复合术语并在参数列表上递归。

于 2012-12-13T17:37:00.637 回答
1

也许基于堆栈的方法可以提供帮助。您可以编写至少四个辅助谓词,如下所示:

% Increases accumulator if T is atomic + call to count_atoms/6
count_atoms(T, Stack, StackSize, Accumulator, Count) :- ...

% Gets the arity of T if T is compound + call to count_atoms/6
count_atoms(T, Stack, StackSize, Accumulator, Count) :- ...

% Gets Nth subterm of T and puts it on the stack + call to count_atoms/6
count_atoms(T, N, Stack, StackSize, Accumulator, Count) :- ...

% Pops element from stack + call to count_atoms/5
count_atoms(T, _, Stack, StackSize, Accumulator, Count) :- ...

但是您仍然需要一个 count_atoms/2 谓词和一个来停止算法并产生结果。

于 2012-12-14T16:03:04.843 回答