View Javadoc

1   /********************************************************************************
2    *
3    *	Copyright (c) 2008 Fujitsu Services Ltd.
4    *
5    *	Author: Nick Battle
6    *
7    *	This file is part of VDMJ.
8    *
9    *	VDMJ is free software: you can redistribute it and/or modify
10   *	it under the terms of the GNU General Public License as published by
11   *	the Free Software Foundation, either version 3 of the License, or
12   *	(at your option) any later version.
13   *
14   *	VDMJ is distributed in the hope that it will be useful,
15   *	but WITHOUT ANY WARRANTY; without even the implied warranty of
16   *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   *	GNU General Public License for more details.
18   *
19   *	You should have received a copy of the GNU General Public License
20   *	along with VDMJ.  If not, see <http://www.gnu.org/licenses/>.
21   *
22   ******************************************************************************/
23  
24  package org.overturetool.vdmj.expressions;
25  
26  import org.overturetool.vdmj.lex.LexLocation;
27  import org.overturetool.vdmj.pog.NonEmptySetObligation;
28  import org.overturetool.vdmj.pog.POContextStack;
29  import org.overturetool.vdmj.pog.ProofObligationList;
30  import org.overturetool.vdmj.runtime.Context;
31  import org.overturetool.vdmj.runtime.ValueException;
32  import org.overturetool.vdmj.typechecker.Environment;
33  import org.overturetool.vdmj.typechecker.NameScope;
34  import org.overturetool.vdmj.types.SetType;
35  import org.overturetool.vdmj.types.Type;
36  import org.overturetool.vdmj.types.TypeList;
37  import org.overturetool.vdmj.types.UnknownType;
38  import org.overturetool.vdmj.values.SetValue;
39  import org.overturetool.vdmj.values.Value;
40  import org.overturetool.vdmj.values.ValueSet;
41  
42  public class DistIntersectExpression extends UnaryExpression
43  {
44  	private static final long serialVersionUID = 1L;
45  
46  	public DistIntersectExpression(LexLocation location, Expression exp)
47  	{
48  		super(location, exp);
49  	}
50  
51  	@Override
52  	public String toString()
53  	{
54  		return "(dinter " + exp + ")";
55  	}
56  
57  	@Override
58  	public Type typeCheck(Environment env, TypeList qualifiers, NameScope scope)
59  	{
60  		Type arg = exp.typeCheck(env, null, scope);
61  
62  		if (arg.isSet())
63  		{
64  			SetType set = arg.getSet();
65  
66  			if (set.empty || set.setof.isSet())
67  			{
68  				return set.setof;
69  			}
70  		}
71  
72  		report(3076, "Argument of 'dinter' is not a set of sets");
73  		return new UnknownType(location);
74  	}
75  
76  	@Override
77  	public Value eval(Context ctxt)
78  	{
79  		breakpoint.check(location, ctxt);
80  
81  		try
82  		{
83      		ValueSet setset = exp.eval(ctxt).setValue(ctxt);
84      		ValueSet result = null;
85  
86      		for (Value v: setset)
87      		{
88  				if (result == null)
89  				{
90  					result = new ValueSet(v.setValue(ctxt));
91  				}
92  				else
93  				{
94  					result.retainAll(v.setValue(ctxt));
95  				}
96      		}
97  
98      		return new SetValue(result);
99      	}
100     	catch (ValueException e)
101     	{
102     		return abort(e);
103     	}
104 	}
105 
106 	@Override
107 	public ProofObligationList getProofObligations(POContextStack ctxt)
108 	{
109 		ProofObligationList obligations = super.getProofObligations(ctxt);
110 		obligations.add(new NonEmptySetObligation(exp, ctxt));
111 		return obligations;
112 	}
113 
114 	@Override
115 	public String kind()
116 	{
117 		return "dinter";
118 	}
119 }