Language | Simulang
simulationライブラリで純粋な関数式プログラミングをします
方程式的なプログラミング | 状態の手順的と関数的な表記の相互変換
VM を作った | 4Dエンジン | 連続と離散の統一
こんな日本語の文字を考案した(画像) | 人工言語
虫は宇宙人 | 人類の品種 | 言葉の起源 | DNAと門・綱・目
日本語は海豚の言葉 | ペンギン(ウルトラマン) | 猫語の「ニャー」の意味は2つ
Diablo 2 全スキル+21のチャーム | X3 TCで工場を買う方法
半光速度で宇宙旅行をする方法(超簡単です)
状態の手順的と関数的な表記の相互変換
0   関東の国王      2021年3月24日 水 1:26
追記
このあたりのことは今日やっと C# で実装できました、ソースコードは後半にて

y = if s = 1 then f1(x) elif s = 2 then f2(x)
<==>
if s=1 then y=f1(x) elif s=2 then y=f2(x)

s' =  if s=1 and a then 2
       elif s=1 and b then 1
       elif s=2 and a then 1
       elif s=2 and c then 2
<==>
s' =  if s=1 and a then s'=2
       elif s=1 and b then s'=1
       elif s=2 and a then s'=1
       elif s=2 and c then s'=2

<==>

if s=1 then
  y=f1(x)
  if a then s'=2 elif b then s'=1
elif s=2 then
  y=f2(x)
  if a then s'=1 elif c then s'= 2

<==>

10 y = f1(x)
    if a then
20   y= f2(x)
        if a then goto 10 elif c then goto 20
    elif  b then
        goto 10                
---------------
1 IF a THEN
2 IF a THEN GOTO 1 ELIF c THEN GOTO 2
ELIF b THEN GOTO 1
y = if s = 1 then f1(x) elif s = 2 then f2(x)
---------------
switch s
case 1
   if a then s' = 2 elif b then s' = 1
case 2
   if a then s' = 1 elif c then s' = 2
y = if s = 1 then f1(x) elif s = 2 then f2(x)
----------------
s' = switch s case 1
       if a then 2 elif b then 1
   case 2
       if a then 1 elif c then 2
y = if s = 1 then f1(x) elif s = 2 then f2(x)

追記
上記の擬似コードをC#で実装してみると:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Takaku;

namespace Simulation.StateX
{
   class CachedVarOfState
   {  
       private Func<object> FuncValue;
       private object Value;
       private bool Calculated;
       public CachedVarOfState(Func<object> funcValue)
       {
           FuncValue = funcValue;
           Calculated = false;
       }
       public object v()
       {
           if (Calculated)
               return Value;
           else
           {
               Calculated = true;
               return Value = FuncValue();
           }
       }
       public void Flush()
       {
           Calculated = false;
       }
   }

   interface IStateX
   {
       void Update();
       void Flush();
   }

   class ManagerX
   {
       public static ManagerX TheManagerX = new ManagerX();
       private LinkedList<IStateX> AllStateX = new LinkedList<IStateX>();
       public void Add(IStateX stateX)
       {
           AllStateX.AddLast(stateX);
       }
       public void Update()
       {
           foreach (IStateX i in AllStateX)
               i.Update();
       }
       public void Flush()
       {
           foreach (IStateX i in AllStateX)
               i.Flush();
       }
   }

   class StateX<S> : IStateX
   {
       public Dictionary<S, Dictionary<string, CachedVarOfState>> CachedVarsOfState = new Dictionary<S, Dictionary<string, CachedVarOfState>>();
       public Dictionary<S, List<Takaku.Tuple<Func<bool>, S>>> Jumps = new Dictionary<S, List<Takaku.Tuple<Func<bool>, S>>>();
       public S Current, Next;
       public StateX(S defaultValue)
       {
           Current = defaultValue;
           ManagerX.TheManagerX.Add(this);
       }
       public void Update()
       {
           foreach (Takaku.Tuple<Func<bool>, S> i in Jumps[Current])
           {
               if (i._1())
               {
                   Next = i._2;
                   return;
               }
           }

           Next = Current;
       }
       public void Flush()
       {
           Current = Next;

           foreach (KeyValuePair<S, Dictionary<string, CachedVarOfState>> i in CachedVarsOfState)
           {
               foreach (KeyValuePair<string, CachedVarOfState> j in i.Value)
               {
                   j.Value.Flush();
               }
           }
       }
       public object GetCachedVar(string nameCachedVar)
       {
           return CachedVarsOfState[Current][nameCachedVar].v();
       }
   }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Simulation.StateX;

namespace SimulationStateXCSharp
{
   public partial class Form1 : Form
   {
       bool Exit = false;

       StateX<byte> stateX = new StateX<byte>(1);
       int x1 = 1;
       double x2 = 2;
       bool a = false, b = false, c = false;

       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {
           stateX.CachedVarsOfState[1] = new Dictionary<string, CachedVarOfState>();
           stateX.CachedVarsOfState[1]["y1"] = new CachedVarOfState(() => x1 + 1);
           stateX.CachedVarsOfState[1]["y2"] = new CachedVarOfState(() => x2 * 2);

           stateX.CachedVarsOfState[2] = new Dictionary<string, CachedVarOfState>();
           stateX.CachedVarsOfState[2]["y1"] = new CachedVarOfState(() => x1 + 2);
           stateX.CachedVarsOfState[2]["y2"] = new CachedVarOfState(() => x2 * 3);

           stateX.Jumps[1] = new List<Takaku.Tuple<Func<bool>, byte>>();
           stateX.Jumps[1].Add(new Takaku.Tuple<Func<bool>, byte>(() => a, 2));
           stateX.Jumps[1].Add(new Takaku.Tuple<Func<bool>, byte>(() => b, 1));
           
           stateX.Jumps[2] = new List<Takaku.Tuple<Func<bool>, byte>>();
           stateX.Jumps[2].Add(new Takaku.Tuple<Func<bool>, byte>(() => a, 1));
           stateX.Jumps[2].Add(new Takaku.Tuple<Func<bool>, byte>(() => c, 2));
       }

       private void Form1_FormClosed(object sender, FormClosedEventArgs e)
       {
           Exit = true;
       }

       private void Form1_Shown(object sender, EventArgs e)
       {
           while (Exit == false)
           {
               ManagerX.TheManagerX.Update();

               ManagerX.TheManagerX.Flush();

               a = false;
               b = false;
               c = false;

               textBox1.Text = stateX.GetCachedVar("y1").ToString();
               textBox2.Text = stateX.GetCachedVar("y2").ToString();

               Application.DoEvents();
           }
       }

       private void button1_Click(object sender, EventArgs e)
       {
           a = true;
       }

       private void button2_Click(object sender, EventArgs e)
       {
           b = true;
       }

       private void button3_Click(object sender, EventArgs e)
       {
           c = true;
       }
   }
}
この記事は 2021年7月14日 水 16:02 に作者によって編集されました
1   関東の国王      2021年7月14日 水 16:03
up
ヒント: アラビア語は、太陽系で最も優れた言語ですよ
名前      編集用パスワード(省略可)    パスワードの記憶
数式 αβγ IPA http:// 画像 B I U
(添付ファイルは http://up.x0000.net/ にアップロードしてください)