0

看起来很简单,我如何初始化一个空关系(比如 [str,int] 类型),然后向它添加新元素?一个近似的流氓代码:

rel[str,int] myReln={};

myReln.add(<"a",1>);

删除/修改操作的示例也将不胜感激。

4

2 回答 2

1

遵守两个原则很重要:

  • 值始终是不可变的,即一旦创建它们就无法更改。
  • 对于变量,您可以随着时间的推移分配不同的值。

在您的示例中:

  • rel[str,int] myReln={};,精细变量myRel现在具有价值{}
  • 向集合或关系中添加新值是由+操作员完成的。在您的情况下,{} + <"a", 1>`。
  • 要将此新值分配给myRel,您可以编写myRel = myReln + <"a", 1>
  • 对此的简写是myReln += <"a", 1>.

可以使用(在本例中)设置差异-

于 2014-11-05T14:09:51.887 回答
1

关系只是集合的一种特殊形式,因此集合上可用的所有操作也适用于关系。您的添加操作实际上是

myReln += < "a", 1 >;

或者

myReln = myReln + < "a", 1 >;

从关系中删除项目类似于将项目添加到关系中。如果您想从中删除元组< "a", 1>myReln您只需编写

myReln = myReln - < "a", 1 >;

或者,作为简写

myReln -= < "a", 1 >;

如果您不知道整个元组,但知道要删除以 开头的任何元组"a",那么您(至少)有两个选择。最简单的是使用库domainX中的Relation函数:

import Relation;
myReln = domainX(myReln, {"a"});

这将删除所有具有"a"作为其第一个元素的元组。你也可以在这个集合中有多个项目,所以如果你想删除任何以任一开头的元组,"a"或者"b"你可以说:

myReln = domainX(myReln, {"a","b"});

另一种选择是使用模式匹配和理解——基本上,通过查看关系中的每个项目并决定是否应该保留它来重建关系。那看起来像:

myReln = { <a,b> | <a,b> <- myReln, a != "a" };

那么修改就是一系列的添加和删除。由于关系是不可变的,我们没有就地修改的概念。

您可以在此处找到有关 Rascal 集的文档:http ://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Expressions/Values/Set/Set.html 。为关系定义的特殊操作(同样,元组集)在这里:http ://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Expressions/Values/Relation/Relation.html

于 2014-11-05T14:07:41.720 回答