# Associativity and meaning of multi-arity signature declarations

**URL:** <https://alloytools.discourse.group/t/associativity-and-meaning-of-multi-arity-signature-declarations/550>\
**Category:** Questions\
**Created:** [March 10, 2026, 5:33pm UTC](https://alloytools.discourse.group/t/associativity-and-meaning-of-multi-arity-signature-declarations/550 "2026-03-10T17:33:10Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![nday](https://avatars.discourse-cdn.com/v4/letter/n/f08c70/32.png) [@nday](https://alloytools.discourse.group/u/nday)\
**Post date:** [March 10, 2026, 5:33pm UTC](https://alloytools.discourse.group/t/associativity-and-meaning-of-multi-arity-signature-declarations/550/1 "2026-03-10T17:33:10Z")

</div>

We have been studying the associativity of the → in multi-arity relations and also the meaning of multiplicities in these declarations.

- **Can an Alloy developer please confirm that the associativity of → is RIGHT?** , i.e.  
sig A { f: B → one C → D }  
means  
sig A { f: B → one (C → D) }  
rather than  
sig A { f: (B → one C) → D }  
Associativity is only relevant with multiplicities so this question does not apply to regular arrow expressions, which cannot include multiplicities.

1. Wrt the meaning of the multiplicities in a field declaration, **can an Alloy developer please confirm that our understanding of the three cases below is correct?**

2. **Could someone explain why a multiplicity is not allowed in the Alloy syntax before an arrow**? As in:  
sig A {  
f: one B → C  
}  
It seems possible to give this a meaning.

Many thanks!

---

<div class="post-metadata">

**Author:** ![alcino](https://yyz2.discourse-cdn.com/free1/user_avatar/alloytools.discourse.group/alcino/32/25_2.png) [@alcino](https://alloytools.discourse.group/u/alcino)\
**Post date:** [April 23, 2026, 12:09pm UTC](https://alloytools.discourse.group/t/associativity-and-meaning-of-multi-arity-signature-declarations/550/2 "2026-04-23T12:09:12Z")

</div>

Hi Nancy,

Probably my answer already comes too late, but here it goes…

I don’t know what exactly is coded in the Alloy Analyzer, but I can confirm all your assumptions by making use of the Analyzer itself.

```alloy
sig A {
	f : B -> C
}
sig B {}
sig C {}

check {
	f in (A -> one B -> C) iff f in (A -> one (B -> C))
} expect 0

check {
	f in (A -> one B -> C) iff f in ((A -> one B) -> C)
} expect 1

check {
	f in (A -> one (B -> C)) iff (all a : A | one a.f)
} expect 0

check {
	f in ((A -> one B) -> C) iff (all a : A, c : C | one a.f.c)
} expect 0

check {
	f in (A one -> (B -> C)) iff (all b : B, c : C | one (f.c).b)
} expect 0

```

As for point 3 I don’t know the answer, but I agree it can trivially be given a meaning, since it is just stating that `f in A -> one B -> C` which works fine.

Regards,  
Alcino
