I did not find it documented as the intended behavior or not, but, looking at the source code , from my (limited) understanding, it looks like map merging happens only with values, and not with keys.
As implemented in unify-with-map* , when core.logic finds the key :key on the first map, it looks at its value in the second, does not find it, and is thus freed when merged. Since there are no solutions like @Arthur Ulfeldt, you get () .
source share