エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

半群の右単位元と左単位元(3)

前回は式が一致するかどうかを調べてくれなかったので、さらにやってみます。

半群の二つの等式を構文解析して、一方の等式の片側の式(両辺のうちのどちらかの式)と、もう一方の等式の片側の式(両辺のうちのどちらかの式)とが、一致するかどうかを調べます。このとき文字列の先頭の文字が大文字のとき変数であるとし、変数は任意の式と一致させることができるとします。そして一致したとき、等式の逆側の式同士を組み合わせて等式を作り、その等式を返します。このとき、変数は変数に一致した式で置き換えます。このようなプログラムを C# で書いてください

理解しました。与えられた二つの等式を構文解析して、一方の等式の片側の式ともう一方の等式の片側の式が一致するかどうかを調べ、一致した場合には等式の逆側の式同士を組み合わせて新しい等式を生成するC#プログラムを作成します。

using System;

class Program
{
    static void Main(string[] args)
    {
        // 入力された等式
        string equation1 = "e_l * X = X";
        string equation2 = "Y = Y * e_r";

        // 一致した等式を生成
        string result = GenerateCombinedEquation(equation1, equation2);

        // 結果の出力
        Console.WriteLine("Result: " + result);
    }

    // 一致した等式を生成するメソッド
    static string GenerateCombinedEquation(string equation1, string equation2)
    {
        // 等式をトークンに分割
        string[] tokens1 = equation1.Split();
        string[] tokens2 = equation2.Split();

        // 等式の片側の式を取得
        string leftSide1 = GetSide(tokens1);
        string rightSide1 = GetSide(tokens1);
        string leftSide2 = GetSide(tokens2);
        string rightSide2 = GetSide(tokens2);

        // 一致する場合、新しい等式を生成して返す
        if (leftSide1 == rightSide2 || rightSide1 == leftSide2)
        {
            // 一致した変数を置き換えた等式を生成
            string newLeftSide = (leftSide1 == rightSide2) ? leftSide1 : rightSide1;
            string newRightSide = (rightSide1 == leftSide2) ? rightSide1 : leftSide1;

            return $"{newLeftSide} = {newRightSide}";
        }

        // 一致しない場合は空文字列を返す
        return "";
    }

    // 等式の片側の式を取得するメソッド
    static string GetSide(string[] tokens)
    {
        string side = "";
        bool foundEqualSign = false;

        foreach (var token in tokens)
        {
            if (token == "=")
            {
                foundEqualSign = true;
                continue;
            }

            if (!foundEqualSign)
            {
                side += token + " ";
            }
        }

        return side.Trim();
    }
}

このプログラムでは、与えられた二つの等式をトークンに分割し、片側の式を取得します。そして、両方の等式の片側の式が一致するかどうかを調べ、一致した場合には逆側の式同士を組み合わせて新しい等式を生成します。

やはり式が一致するかどうかを調べてくれません。