我怎么算原子Prolog?

时间:2012-12-13 17:02:34

标签: prolog logic

我该如何解决这个问题?

输入:     count_atoms(T,计数)

输出      count_atoms(A(B,C(d,e)中,f)中,计数)。      数= 4;

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

2 个答案:

答案 0 :(得分: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谓词和一个停止算法并产生结果。

答案 1 :(得分:0)

使用SWI-Prolog的库(aggregate)和递归:

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.

但我担心这不是你的任务的解决方案。对于更基本的东西,您可以使用compound分解任何=..项并递归参数列表。