ChatGPTにUMLクラス図を作図してもらう（Ph1 ロジック仕様記述言語 の構文の仕込み）

# はじめに
Mermaidのソースコードで直接ダイアグラムをさくさく書けるひとは多いのかもしれません。私にとっては周辺の技術になるので、そらでさらさら書けるところまで習得する予定はないです。代わりに日本語記述のロジック仕様記述言語が間接的なソースコードになるとうれしいなというお話です。

## この記事内容の作業目的
自作ロジック仕様記述言語Re:Mindの構文仕様をAIに学習してもらい、UMLクラス図を作図してもらうことから、日本語ロジック仕様記述言語がUMLクラス図の間接的なソースコードになりうるか検討します。

## この記事内容の保証
※この記事にはAIが自動生成した情報が含まれます。AIが自動生成して書かれた内容の妥当性は保証されません。

# 実行結果
ChatGPTにご提示いただいたMermaidのソースコードでエラーのない状態は、都度Qiita上でイメージ描画するようにしています。

## ChatGPT3.5
私：
こんにちは！あなたは先日のUMLのアクティビティ図の作図について覚えていますか？

ChatGPT：
>はい、覚えています。UMLのアクティビティ図の作図についてお手伝いできます。どのようなアクティビティ図を描きたいですか？

私：
今度はクラス図を書きたいです。だいじょうぶですか？
ChatGPT：
>もちろん、クラス図についてもお手伝いできます。クラス図の作成に関する具体的な要件や詳細を教えていただければ、できる限りお役に立てるよう努力します。どのようなクラス図を作成したいですか？

私：
これから、わたしが考案した日本語ロジック仕様記述言語Re:Mind リマインド のクラスの記述ルールを説明します。
このセッション内で覚えておいていただくことは可能ですか？

ChatGPT：
>もちろん、Re:Mind リマインド のクラスの記述ルールについて説明いただければ、それに従ってクラス図を作成するのに役立ちます。詳細な説明をお願いします。


私：
クラスの宣言
```mind:Re:Mind
   ▽class メンバーの取り扱い方 : 取り扱い方

        ・変数整数 年齢
        ・変数文字列 名前
        ・変数ブール値 特待区分
    
        ▽整数 メンバーの年齢を取得する(string 名前,bool 区分)
             //todo
            □(齢)を 返す
        △
    
        ▽メンバーの年齢を設定する(string 名前,bool 区分)
             //todo
        △

    △

```
・全角記号の下三角▽がクラス宣言の開始となります。
・続いて半角空白をおいて、classを書きます。ここは全角カタカナで「クラス」と書いても可。
・続いて半角空白をおいて、クラス名を書きます。
・続いて半角空白をおいて、クラス継承表記を書きます。その後は半角空白をおいて、継承元のクラス名を書きます。継承しない場合はこれらの記述は省略可です。
・クラスのメンバの書き方は変数宣言、関数宣言に準じます。
・型名は一般的なプログラミング言語の半角型名でも可。
・全角記号の上三角△で定義を終了します。

ChatGPT：
>Re:Mind リマインド のクラスの記述ルールについての説明ありがとうございます。これに基づいてクラス図を作成できます。必要な情報を含めたい場合、具体的なクラス名や関数名などを教えていただければ、詳細なクラス図を作成する手助けができます。どのようなクラス図を作成したいかについての詳細をお知らせいただければ、効果的な描画をサポートできます。

私：
```mind:Re:Mind
   ▽class 取り扱い方

        ・変数ブール値 取り扱い区分
    
        ▽ブール値 取り扱い区分を取得する()
            □取り扱い区分を 返す
        △
    
        ▽取り扱い区分を設定する(bool 区分)
             □取り扱い区分=区分
        △

    △
```
ChatGPT：
>ありがとうございます。提供された情報をもとに、"取り扱い方"というクラスのクラス図を作成しましょう。
以下はクラス図です：

```:mermaid
classDiagram
    class 取り扱い方 {
        + 取り扱い区分 : bool
        + 取り扱い区分を取得する() : bool
        + 取り扱い区分を設定する(区分: bool) : void
    }
```
>このクラス図では、「取り扱い方」というクラスが定義されており、それには「取り扱い区分」というブール型のメンバ変数があります。また、クラス内には「取り扱い区分を取得する」メソッドと「取り扱い区分を設定する」メソッドが含まれています。
上記のクラス図は、提供された情報に基づいて描かれたものです。必要に応じてクラス図をカスタマイズし、他の関連クラスとの関係を追加することができます。詳細な情報やカスタマイズが必要な場合は、お知らせください。

```mermaid:
classDiagram
    class 取り扱い方 {
        + 取り扱い区分 : bool
        + 取り扱い区分を取得する() : bool
        + 取り扱い区分を設定する(区分: bool) : void
    }
```



私：
ありがとうございます。class メンバーの取り扱い方 はclass 取り扱い方の派生クラスになります。その関係を描けますか？
```mind:Re:Mind
   ▽class メンバーの取り扱い方 : 取り扱い方

        ・変数整数 年齢
        ・変数文字列 名前
        ・変数ブール値 特待区分
    
        ▽整数 メンバーの年齢を取得する(string 名前,bool 区分)
             //todo
            □(齢)を 返す
        △
    
        ▽メンバーの年齢を設定する(string 名前,bool 区分)
             //todo
        △

    △
```
    
ChatGPT：

>了解しました。"メンバーの取り扱い方" クラスが "取り扱い方" クラスの派生クラスである関係を描くため、クラス図を修正しましょう。
以下が修正後のクラス図です：

```:mermaid
classDiagram
    class 取り扱い方 {
        + 取り扱い区分 : bool
        + 取り扱い区分を取得する() : bool
        + 取り扱い区分を設定する(区分: bool) : void
    }
    
    class メンバーの取り扱い方 --|> 取り扱い方 {
        + 年齢 : int
        + 名前 : string
        + 特待区分 : bool
        + メンバーの年齢を取得する(名前: string, 区分: bool) : int
        + メンバーの年齢を設定する(名前: string, 区分: bool) : void
    }
```
>この修正後のクラス図では、"メンバーの取り扱い方" クラスが "取り扱い方" クラスの派生クラスであることが示されています。また、"メンバーの取り扱い方" クラス内には "年齢"、"名前"、"特待区分" といったメンバ変数、および "メンバーの年齢を取得する" メソッドと "メンバーの年齢を設定する" メソッドが含まれています。
これにより、クラス間の継承関係が正しく表現されました。必要に応じて他の関係や詳細を追加できます。また、質問があればどうぞお知らせください。


私：
ありがとうございます。Mermaidエディタが下図のエラーを返しました。
```:mermaid
Error: Parse error on line 8:
... class メンバーの取り扱い方 --|> 取り扱い方 {
-----------------------^
Expecting 'NEWLINE', 'EOF', 'SQS', 'STRUCT_START', 'STRUCT_STOP', 'STYLE_SEPARATOR', got 'LINE'
```

ChatGPT：
>申し訳ありません、Mermaidでの表現が正しくありませんでした。Mermaidのクラス図の表現方法について誤ってお伝えしました。
以下が正しいMermaidクラス図の表現です：

```:mermaid
classDiagram
    class 取り扱い方 {
        + 取り扱い区分 : bool
        + 取り扱い区分を取得する() : bool
        + 取り扱い区分を設定する(区分: bool) : void
    }

    class メンバーの取り扱い方 {
        + 年齢 : int
        + 名前 : string
        + 特待区分 : bool
        + メンバーの年齢を取得する(名前: string, 区分: bool) : int
        + メンバーの年齢を設定する(名前: string, 区分: bool) : void
    }

    メンバーの取り扱い方 --|> 取り扱い方
```
>この修正を加えたMermaidコードでクラス図を描画することができます。これにより、"メンバーの取り扱い方" クラスが "取り扱い方" クラスの派生クラスである関係が正しく表現されます。
お手数をおかけしましたが、これで正しく動作するはずです。何か他に質問があればお知らせください。

私：
今度のは正常に描画できました。ありがとうございました。
ChatGPT：
>どういたしまして！正しく描画できて良かったです。何か他の質問や描画が必要なことがあれば、どうぞお知らせください。お手伝いできることがあります。

# おわりに
生成AIにいろいろやってもらうのは自然言語で対話しつつ形式言語のソースコードを調整していく形になりますが、今回、前回のアクティビティ図に比べて、だいぶストレスなく進行することができました。ロジック仕様記述言語からMermaidへのトランスコンパイラという処理系はクラス図の実装としても成り立つ気はします。

今回の最終状態
```mermaid:
classDiagram
    class 取り扱い方 {
        + 取り扱い区分 : bool
        + 取り扱い区分を取得する() : bool
        + 取り扱い区分を設定する(区分: bool) : void
    }

    class メンバーの取り扱い方 {
        + 年齢 : int
        + 名前 : string
        + 特待区分 : bool
        + メンバーの年齢を取得する(名前: string, 区分: bool) : int
        + メンバーの年齢を設定する(名前: string, 区分: bool) : void
    }

    メンバーの取り扱い方 --|> 取り扱い方
```
# 参考リンク

https://qiita.com/mylifewithviolin/items/52f806777e6ea031de94

https://qiita.com/mylifewithviolin/items/127a963be816f91b4c84