どうすればこの問題を解決できますか??
入力: count_atoms(T,Count)
count_atoms(a(b,c(d,e),f),Count) を出力します。カウント = 4 ;
本当にわかりません...助けてください??
スタックベースのアプローチが役立つかもしれません。次のような少なくとも 4 つのヘルパー述語を記述できます。
% 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 述語と、アルゴリズムを停止して結果を生成する述語が必要です。
SWI-Prolog と再帰によるlibrary( 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.
しかし、これはあなたの任務の解決策ではないのではないかと心配しています。より基本的なものについては、=..を使用して複合項を分解し、引数リストで再帰することができます。