# A ternary relation question

**URL:** <https://alloytools.discourse.group/t/a-ternary-relation-question/312>\
**Category:** models\
**Created:** [December 21, 2022, 8:35pm UTC](https://alloytools.discourse.group/t/a-ternary-relation-question/312 "2022-12-21T20:35:00Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![victor](https://avatars.discourse-cdn.com/v4/letter/v/3e96dc/32.png) [@victor](https://alloytools.discourse.group/u/victor)\
**Post date:** [December 21, 2022, 8:35pm UTC](https://alloytools.discourse.group/t/a-ternary-relation-question/312/1 "2022-12-21T20:35:00Z")

</div>

I have this model

```auto
 sig Factor {}
 sig Rule { rule : some Factor }
 sig RuleSet { rules : some Rule }
 sig EventRuleProperty {}
 
 sig Event {
       rulesets : some RuleSet,
       rule_properties : rulesets -> Rule -> EventRuleProperty
}

```

How do I write a fact to restrict the rules in `Event.rule_properties` have to belong to `Event.ruleset`?  
i tried to declare as

```auto
rule_properties : rulesets -> rulesets.rules -> EventRuleProperty

```

got a syntax error

---

<div class="post-metadata">

**Author:** ![grayswandyr](https://yyz2.discourse-cdn.com/free1/user_avatar/alloytools.discourse.group/grayswandyr/32/17_2.png) [@grayswandyr](https://alloytools.discourse.group/u/grayswandyr)\
**Post date:** [December 22, 2022, 9:27am UTC](https://alloytools.discourse.group/t/a-ternary-relation-question/312/2 "2022-12-22T09:27:56Z")

</div>

“Complex” constraints on fields cannot appear in type declarations, you must add a supplemental fact:

```auto
fact { all e: Event | e.rule_properties in e.rulesets -> e.rulesets.rules -> EventRuleProperty }

```

---

<div class="post-metadata">

**Author:** ![victor](https://avatars.discourse-cdn.com/v4/letter/v/3e96dc/32.png) [@victor](https://alloytools.discourse.group/u/victor)\
**Post date:** [December 23, 2022, 7:37pm UTC](https://alloytools.discourse.group/t/a-ternary-relation-question/312/3 "2022-12-23T19:37:45Z")

</div>

this doesn’t quite do it. see below, `RuleSet_1` has only 1 rule, but `Event_0.rule_properties` maps it to two rules. but your tip is helpful, i will play with it for a bit to fix the model. thanks!

```auto
RuleSet_0 { Rule_0, Rule_1 }
RuleSet_1 { Rule_1 }

Event_0 {
   rule_properties : { 
        RuleSet_1 -> Rule_0 -> EventRuleProperty, 
        RuleSet_1 -> Rule_1 -> EventRuleProperty, 
}

```

---

<div class="post-metadata">

**Author:** ![grayswandyr](https://yyz2.discourse-cdn.com/free1/user_avatar/alloytools.discourse.group/grayswandyr/32/17_2.png) [@grayswandyr](https://alloytools.discourse.group/u/grayswandyr)\
**Post date:** [December 24, 2022, 3:27pm UTC](https://alloytools.discourse.group/t/a-ternary-relation-question/312/4 "2022-12-24T15:27:27Z")

</div>

Well I addressed your syntax error issue. What do you want to specify exactly?

---

<div class="post-metadata">

**Author:** ![victor](https://avatars.discourse-cdn.com/v4/letter/v/3e96dc/32.png) [@victor](https://alloytools.discourse.group/u/victor)\
**Post date:** [December 26, 2022, 1:22am UTC](https://alloytools.discourse.group/t/a-ternary-relation-question/312/5 "2022-12-26T01:22:15Z")

</div>

I got one instance, which isn’t correct, please see the screenshot.

 ![Screen Shot 2022-12-25 at 6.15.18 PM](https://global.discourse-cdn.com/free1/uploads/alloytools/original/1X/f52e2beefe2fabc62c651384b9e0cad8c528c35e.png)

```auto
sig Factor {}
 sig Rule { rule : some Factor }
 sig RuleSet { rules : some Rule }
 sig EventRuleProperty {}
 
 sig Event {
       rulesets : some RuleSet,
       rule_properties : rulesets -> Rule -> one EventRuleProperty
}

fact {
    all e: Event | 
        e.rule_properties in e.rulesets -> e.rulesets.rules -> one EventRuleProperty 
}

```

---

<div class="post-metadata">

**Author:** ![victor](https://avatars.discourse-cdn.com/v4/letter/v/3e96dc/32.png) [@victor](https://alloytools.discourse.group/u/victor)\
**Post date:** [December 26, 2022, 3:39am UTC](https://alloytools.discourse.group/t/a-ternary-relation-question/312/6 "2022-12-26T03:39:52Z")

</div>

I changed the `fact`, seems it fixed the issue

```auto
fact {
    all e : Event, rs : RuleSet, r : Rule {
        e.rule_properties in e.rulesets -> e.rulesets.rules -> one EventRuleProperty
        r !in rs.rules implies r !in e.rule_properties[rs].EventRuleProperty
   }
}

```
