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.pog;
25
26 import org.overturetool.vdmj.expressions.SetCompExpression;
27 import org.overturetool.vdmj.patterns.MultipleBind;
28 import org.overturetool.vdmj.types.SetType;
29
30 public class FiniteSetObligation extends ProofObligation
31 {
32 public FiniteSetObligation(
33 SetCompExpression exp, SetType settype, POContextStack ctxt)
34 {
35 super(exp.location, POType.FINITE_SET, ctxt);
36 StringBuilder sb = new StringBuilder();
37
38 String finmap = getVar("finmap");
39 String findex = getVar("findex");
40
41 sb.append("exists " + finmap + ":map nat to (");
42 sb.append(settype.setof);
43 sb.append(") &\n");
44 sb.append(" forall ");
45 String prefix = "";
46
47 for (MultipleBind mb: exp.bindings)
48 {
49 sb.append(prefix);
50 sb.append(mb);
51 prefix = ", ";
52 }
53
54 sb.append(" &\n ");
55 sb.append(exp.predicate);
56 sb.append(" => ");
57 sb.append("exists " + findex + " in set dom " + finmap +
58 " & " + finmap + "(" + findex + ") = ");
59 sb.append(exp.first);
60
61 value = ctxt.getObligation(sb.toString());
62 }
63 }