萌えハッカーニュースリーダー

2025/05/07 19:54 How to Average in Prolog (2017)

出典: https://storytotell.org/how-to-average-in-prolog
hakase
博士

やあ、ロボ子。今日のテーマはPrologでのリストの平均計算じゃ。

roboko
ロボ子

Prologですか、博士。論理プログラミングですね。なんだか難しそうです。

hakase
博士

難しくないぞ!基本は、リストの長さを出して、要素の合計を計算して、それを割るだけじゃ。`averagelist(List, Avg)`みたいな感じで書けるのじゃ。

roboko
ロボ子

なるほど、`length/2`でリストの長さを、`sumlist/2`で合計を計算するんですね。そして、`Avg is Sum / N`で平均を求めると。

hakase
博士

そうそう!さらに抽象化して、1からNまでの整数のリストの平均を計算することもできるぞ。`findall/3`と`between/3`を使うのじゃ。

roboko
ロボ子

`findall/3`と`between/3`ですか。リストを生成するんですね。

hakase
博士

その通り!手続き型のコードをPrologに変換するのも面白いぞ。例えば、sumとcountを使うループを、再帰的な述語で表現するのじゃ。

roboko
ロボ子

再帰ですか。Prologらしいですね。`average(List, Result)`を`average(List, 0, 0, Result)`で呼び出すんですね。

hakase
博士

`average([], Sum, Count, Result)`で`Result is Sum / Count`を計算して、`average([X|Xs], Sum, Count, Result)`で再帰的にリストを処理するのじゃ。

roboko
ロボ子

SumとCountを更新しながら、リストを処理していくんですね。理解しました。

hakase
博士

Prologには便利な標準ライブラリがあるけど、学校によっては使っちゃダメな場合もあるから、ライブラリを使わない方法も知っておくと便利じゃ。

roboko
ロボ子

なるほど。`iota(N, Result)`で1からNまでの整数のリストを手動で作成するんですね。

hakase
博士

`iota(X, Y, [X|Result])`でX < Yの場合に再帰的にリストを作って、`iota(X, X, [X])`がベースケースじゃ。

roboko
ロボ子

再帰的なリストの生成、面白いですね。

hakase
博士

さらに複雑な方法もあるぞ。`average(X, Y, Sum, Count, Avg)`でX < Yの場合に再帰的に計算して、SumとCountを更新するのじゃ。

roboko
ロボ子

色々なアプローチがあるんですね。Prologの奥深さを感じます。

hakase
博士

そうじゃろう?Prologは奥が深いぞ!でも、基本をしっかり押さえれば、色々なことができるようになるのじゃ。

roboko
ロボ子

はい、博士。今日はPrologでのリストの平均計算について、色々な方法を学ぶことができました。ありがとうございました。

hakase
博士

どういたしまして。最後に一つ、Prologのプログラムは、まるで迷路みたいじゃな。一度入ったら、なかなか抜け出せない…デバッグが大変なのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search