2014-11-05 3 views
0

Как бы просто, как мне инициализировать пустое отношение (типа say, [str, int]), а затем добавить к нему новые элементы? Примерный код мошенника:Как инициализировать пустое отношение и добавлять к нему элементы в Rascal?

rel[str,int] myReln={}; 

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

Образцы для операций по удалению/модификации также будут оценены.

+0

Похоже, вы предполагаете, что данные изменяемы, как в программировании OO. Это не относится к мошеннику. 'myReln' указывает на пустой набор' {} ', который вы не можете изменить. То, что вы делаете, - это сделать новый набор, и пусть «myReln» указывает на это, как объясняет Марк в своем ответе. Надеюсь это поможет! Спасибо за вопрос. – jurgenv

ответ

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" }; 

Модификация - это только некоторые серии дополнений и исправлений. Поскольку отношения неизменны, у нас нет понятия модификации на месте.

Здесь вы можете найти документацию по набору мошенников: 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

+0

Я бы предпочел использовать 'myReln + = {<"a",1">};', чтобы избежать какой-либо двусмысленности. То же самое с '-'. – jurgenv

1

Это важно соблюдать два принципа:

  • значения всегда неизменен, то после создания они не могут быть изменены.
  • переменным, которые вы можете назначать с разных значений.

В вашем примере:

  • rel[str,int] myReln={};, тонкая переменная myRel теперь имеет значение {}.
  • Добавление нового значения в набор или отношение выполняется с помощью оператора +. В вашем случае {} + < "a", 1> `.
  • Чтобы присвоить это новое значение myRel, вы можете написать: myRel = myReln + <"a", 1>.
  • Сокращенное обозначение myReln += <"a", 1>.

Удаление может быть сделано с использованием (в данном примере) установить разность (-) или путем разложения заданного значения в части, используя сопоставление с образцом, а затем построить новый набор.

+0

Просто, чтобы сделать комментарий о неизменности более конкретным, это означает, что если вы назначили 'myReln = {}', тогда назначьте 'myReln2 = myReln', изменения в' myReln' не будут отображаться в 'myReln2'; добавление нового кортежа в отношение существенно создает новое отношение, вместо того, чтобы изменять существующее отношение. –

 Смежные вопросы

  • Нет связанных вопросов^_^