私は現在、スキームセマンティクスを使用してPythonプログラムを作成しようとしているため、後で多くのPythonicに依存することなくSchemeに変換できます。
*、深さ優先、幅優先の検索アルゴリズムを使用して、スライド パズル問題 (正方形に配置された 9 つのスロットと 8 つのタイルがある) を解こうとしています。私は 11 年前に Lisp の AI クラスでこれを行いましたが、基本的に当時は Lisp について何も知らず、心から嫌いでした。振り返ってみると、Lisp で「C」をプログラミングしていたことに気づきました。教授はこの問題で助けにはなりませんでした。
2 つのタイルを簡単に交換できる Python 関数があります。
def swap(p, (r1, c1), (r2, c2)):
# Swaps *any* two locations and returns new configuration
# Does not concern itself with zero location, etc
# Not sure how to do this functionally
p_p = p[:]
temp = p_p[r1][c1]
p_p[r1][c1] = p_p[r2][c2]
p_p[r2][c2] = temp
return p_p
これを SICP で見られるようなものに変えて、副作用などを回避したいと思います。
しかし、これは疑問を引き起こします。私が SICP で読んだものはすべて、再帰によるループです。一定時間で配列/ベクトル/リストにアクセスする際に何も見ませんでした。要素を読み取るためのループ的/再帰的な方法を想像することはできますが、set! のようなものを生成する副作用を呼び出さずに、クレイジーな if に頼ることなく、特定の要素を変更した新しいリストを作成する方法を想像するのは難しいと思います。どの要素を変更する必要があるかに関する /then/else 句。もちろん、2次元配列を考えると、これはさらに混乱します。この場合、多次元配列がネイティブにサポートされているため、Python を使用したソリューションは明らかです。
C/C++/Python/Matlab/Lua/その他では、[i] 構文を介してリスト/配列にアクセスするのは簡単で、その下のどこかでハードウェア指向のポインター ルックアップに直接変換されます。SICP バージョンの scheme で定義されたアトミック操作を考えると、scheme がこれを行う方法がわかりません。これらはすべて非常にループと検索指向のようです。ベクトルおよびリスト配列アクセス関数はどのように機能して一定時間のアクセスを取得しますか? (私はここではまったくの初心者なので、どの機能について話しているのかわかりません)。密かにアクセスされている C またはアセンブリ ライブラリはどこかにありますか? リスト/配列/ベクトルアクセスに使用できるスキームに固有の定数時間セマンティクスはありますか?
Schemishセマンティクスを使用してPythonで上記の関数を書き直すにはどうすればよいですか? 上記の関数をSchemeでどのように書き換えますか?