programming language
Revisión | 854ae1d1b39b4038278986053592dfeeb778b6a2 (tree) |
---|---|
Tiempo | 2021-12-27 22:45:16 |
Autor | dhrname <dhrname@joes...> |
Commiter | dhrname |
New a PowerSetElementModel class
@@ -515,7 +515,7 @@ namespace jstr | ||
515 | 515 | |
516 | 516 | |
517 | 517 | /*getUnionMap メンバ関数 |
518 | - * 直和の随伴射を返す | |
518 | + * 直和集合を示すマップを返す | |
519 | 519 | * 後述するdisjointメンバ関数で使う*/ |
520 | 520 | virtual std::unordered_map<std::string, UnionModel*> getUnionMap() |
521 | 521 | { |
@@ -526,6 +526,10 @@ namespace jstr | ||
526 | 526 | * 引数のuniと、自身を和集合として、直和を構成する*/ |
527 | 527 | virtual void disjoint(UnionModel* uni) |
528 | 528 | { |
529 | + if (nullptr == uni) | |
530 | + { | |
531 | + throwMapMatchError("nullptr", " UnionMap", "UnionModel::disjoint"); | |
532 | + } | |
529 | 533 | unionmap.merge(uni->getUnionMap()); |
530 | 534 | unionmap[uni->getId()] = uni; |
531 | 535 | } |
@@ -546,12 +550,66 @@ namespace jstr | ||
546 | 550 | } |
547 | 551 | }; |
548 | 552 | |
549 | - /*PowerSetModel クラス | |
550 | - * べき集合型モデルのクラス | |
553 | + /*PowerSetElementModel クラス | |
554 | + * べき集合型の一つの元を表現するモデルのクラス | |
551 | 555 | * ブール数集合の直積と、対象となる集合の直積の組み合わせで表現できる |
552 | 556 | * 構造化プログラミング第二部「データ構造化」を参照*/ |
553 | - class PowerSetModel: public CartesianProductModel | |
557 | + class PowerSetElementModel: public CartesianProductModel | |
554 | 558 | { |
559 | + private: | |
560 | + /*boolmapは特徴関数を示すマップのベクタ | |
561 | + * Set⊆Bとなるような、べき集合Bを置くと、 | |
562 | + * name∈Set のとき、boolmap[name] = true。 | |
563 | + * name∉Setのとき、false*/ | |
564 | + std::unordered_map<std::string, bool> boolmap; | |
565 | + /*べき集合の対象となる集合(都合上、直積型モデルを使う)*/ | |
566 | + CartesianProductModel* targetSet; | |
567 | + public: | |
568 | + PowerSetElementModel(const std::string& id) | |
569 | + :CartesianProductModel::CartesianProductModel(id), | |
570 | + boolmap{} | |
571 | + { | |
572 | + } | |
573 | + | |
574 | + /*getBoolMap メンバ関数 | |
575 | + * 特徴関数を表すboolmapを返す*/ | |
576 | + std::unordered_map<std::string, bool> getBoolMap() | |
577 | + { | |
578 | + return boolmap; | |
579 | + } | |
580 | + | |
581 | + /*addSetOf メンバ関数 | |
582 | + * 対象となる集合eleを追加する*/ | |
583 | + void addSetOf(CartesianProductModel* ele) | |
584 | + { | |
585 | + targetSet = ele; | |
586 | + } | |
587 | + | |
588 | + void adjoint(Arrow* arr) override | |
589 | + { | |
590 | + CartesianProductModel::adjoint(arr); | |
591 | + boolmap[arr->getId()] = true; | |
592 | + } | |
593 | + | |
594 | + /*hasElement メンバ関数 | |
595 | + * べき集合Bに含まれる要素S( すなわち、S∈B, S⊆B )に、name∈Sかどうかを、さらに要素判定 | |
596 | + * 「構造化プログラミング 第二部 データ構造化」のin操作を参照*/ | |
597 | + bool hasElement(const std::string& name) | |
598 | + { | |
599 | + if ( !this->hasArrowMap(name) ) | |
600 | + { | |
601 | + return false; | |
602 | + } | |
603 | + else if ( !boolmap.contains(name) ) | |
604 | + { | |
605 | + return false; | |
606 | + } | |
607 | + else | |
608 | + { | |
609 | + return boolmap[name]; | |
610 | + } | |
611 | + } | |
612 | + | |
555 | 613 | }; |
556 | 614 | |
557 | 615 | /*ObjectTypeValue クラス |
@@ -561,7 +619,7 @@ namespace jstr | ||
561 | 619 | { |
562 | 620 | CartesianProductModel* cartesianProductType; |
563 | 621 | UnionModel* uniType; |
564 | - PowerSetModel* powerSetType; | |
622 | + PowerSetElementModel* powerSetType; | |
565 | 623 | }; |
566 | 624 | |
567 | 625 | /*BooleanTypeValue クラス |
@@ -1687,14 +1745,6 @@ int main(int argc, char **argv) | ||
1687 | 1745 | EXPECT(unimod2->getUnionModel("className"), unimod); |
1688 | 1746 | EXPECT(unimod2->getUnionModel("className2"), unimod2); |
1689 | 1747 | |
1690 | - jstr::Arrow* arrabb(new jstr::Arrow("remoteNameC")); | |
1691 | - arrabb->setDomain("15"); | |
1692 | - arrabb->setCodomain("i08"); | |
1693 | - jstr::Arrow* arrabc(new jstr::Arrow("remoteNameD")); | |
1694 | - arrabc->setDomain("0.2"); | |
1695 | - arrabc->setCodomain("flo"); | |
1696 | - unimod2->adjoint(arrabb); | |
1697 | - unimod2->adjoint(arrabc); | |
1698 | 1748 | delete unimod; |
1699 | 1749 | unimod = nullptr; |
1700 | 1750 | delete unimod2; |
@@ -1703,10 +1753,26 @@ int main(int argc, char **argv) | ||
1703 | 1753 | arraab = nullptr; |
1704 | 1754 | delete arraac; |
1705 | 1755 | arraac = nullptr; |
1706 | - delete arrabb; | |
1707 | - arrabb = nullptr; | |
1708 | - delete arrabc; | |
1709 | - arrabc = nullptr; | |
1756 | + | |
1757 | + jstr::PowerSetElementModel* psmod = new jstr::PowerSetElementModel("className"); | |
1758 | + jstr::CartesianProductModel* cpmod2 = new jstr::CartesianProductModel("className2"); | |
1759 | + psmod->addSetOf(cpmod2); | |
1760 | + jstr::Arrow* arrab2(new jstr::Arrow("remoteNameA")); | |
1761 | + arrab2->setDomain("12"); | |
1762 | + arrab2->setCodomain("i08"); | |
1763 | + jstr::Arrow* arrac2(new jstr::Arrow("remoteNameB")); | |
1764 | + arrac2->setDomain("0.1"); | |
1765 | + arrac2->setCodomain("flo"); | |
1766 | + cpmod2->adjoint(arrab2); | |
1767 | + cpmod2->adjoint(arrac2); | |
1768 | + delete psmod; | |
1769 | + psmod = nullptr; | |
1770 | + delete cpmod2; | |
1771 | + cpmod2 = nullptr; | |
1772 | + delete arrab2; | |
1773 | + arrab2 = nullptr; | |
1774 | + delete arrac2; | |
1775 | + arrac2 = nullptr; | |
1710 | 1776 | |
1711 | 1777 | |
1712 | 1778 | jstr::AbstractSyntaxTree* ast = new jstr::AbstractSyntaxTree(); |
@@ -1784,6 +1850,11 @@ int main(int argc, char **argv) | ||
1784 | 1850 | delete cpcdmod; |
1785 | 1851 | cpcdmod = nullptr; |
1786 | 1852 | |
1853 | + jstr::UnionModel* unimod3 = new jstr::UnionModel("className"); | |
1854 | + TRY_EX(unimod3->disjoint(nullptr)); | |
1855 | + delete unimod3; | |
1856 | + unimod3 = nullptr; | |
1857 | + | |
1787 | 1858 | std::string str1 = "ABC...Finished!"; |
1788 | 1859 | |
1789 | 1860 | std::cout << "S" << str1 << std::endl; |