2011-09-16 13 views
1

誰もがこの問題を解決する方法を知っていますプロローグの比較問題

counts式内の演算子の出現回数をカウントします。たとえば、クエリ:

?- count(a+b*c-(2+3*4)/(5*(2+a)+(b+c)^f((d-e)*(x-y))), *, C). 

はC上の最初の引数と出力として与えられた式の演算子*の出現回数をカウントします

私はSWI-プロローグ

答えて

2

を使用していますがこれです宿題?

はここにいくつかのヒントです:

  • Prologのオペレータは、通常プロローグ用語周りのシンタックスシュガーです。式3 * 2 + 1は、用語'+'('*'(3,2),1)として解析されます。

  • 組み込み述語=..は、用語をリストに分解します。その頭部はファンクタであり、その末尾には元の用語の引数である[分解されていない]項が含まれます。

  • 組み込み述語functor/3は、そのファンクタおよびアーティーで用語を統一します。

  • arg/3を見ると、指定された用語の引数を序数で調べることができます。

これで、非常に単純な再帰的解決策が提示されるはずです。希望の演算子の要因を考慮する必要がある場合は、もう少し畳み込まれています(ただしあまり意味はありません)。