this blogpost was partially inspired by https://lajili.com/posts/post-1/

IPC

Type mismatches

consider the following conversation

Q: “Does god exist?”
A: “In my opinion, the existence of a deity or deities is not supported by scientific evidence or reasoning, which guides my understanding of the universe and our place in it.”

   | 
2  | answer(Opinion("the existence of ..."));
   | -------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `String`, found `Opinion<String>`
   | |
   | arguments to this function are incorrect
   | 
   = note: expected type `String`
              found enum `Opinion<String>`

This is a type mismatch, the Asker was seeking a statement of fact. Thankfully our interpreter can do context dependent implicit conversion.

here are a couple of other examples and what types they would expect,


|----------------------------------------------|-------------------------|-----------------------|
| Question                                     | Expected Type           | Available Conversions |
|----------------------------------------------|-------------------------|-----------------------|
| "do you still want this, or can I eat this?" | `Tuple<Boolean,Boolean>`| `Boolean`             |
| "do you want A, B or C"                      | `Enum(A,B,C)`           | `Integer`             |
| "A or B"                                     | `Enum(A,B)`             | `Boolean, Integer`    |
|----------------------------------------------|-------------------------|-----------------------|

Value/Sign mismatch

Another source of misunderstanding is the use of double negatives.

Sometimes when we ask a question we get an answer in the form of a Tuple<Boolean,String> where examining either the Boolean or the String will result in different conclusions

a common example would be:

Q: “You don’t want desert right?” A: “No, I don’t.”

“No I don’t.” is of type Tuple<Boolean,String> specifically Tuple<False, "I don't">. The boolean False could initially suggest agreement with the statement (implying they do want dessert), but the string “I don’t” actually affirms the initial question’s negative phrasing, indicating they do not want dessert. This creates a situation where the Boolean and String components of the answer seem to contradict each other if taken at face value without considering the context of double negatives. In cases like this the String usually overwrites the Boolean

Type aliasing and Conflicting Definitions

When having a conversation, two parties might have conflicting definitions of concepts, similar to a “dependency conflict” in software development. This issue is akin to a linker error that arises when your project’s dependencies require two different versions of a library, each containing conflicting definitions.

error[E0499]: version conflict for 'definitions' dependency
  --> src/conversation.ipc:1:5
   | 
1  | use definitions::RATIONALITY;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^
   | 
   = note: the current application depends on 'definitions' version 15.3.8 (economics) and 13.7.3 (philosophy)
   = note: Answerer's 'definitions' version 15.3.8 (economics) defines RATIONALITY as "Making decisions based on maximizing utility or benefit within constraints."
   = note: Asker's 'definitions' version 13.7.3 (philosophy) defines RATIONALITY as "Being reasonable, coherent, and logical in thinking and decision-making, beyond just self-interest"
   = note: consider calling "evidence_sharing()" or "agree_to_disagree()" or explicitly specifying which version you are referencing to resolve the conflict

Sometimes it’s acceptable to fail silently when encountering conflicting definitions in a conversation, like in cases where: (A) the definition in question is not central to the information being communicated. (B) the definitions are close enough that they still allow for effective communication.

However, in all other scenarios, it may be necessary to engage in evidence sharing to resolve these conflicts.