Commonsense rules development
A place to develop and maintain commonsense rules for quasimodo etc.
Sisukord
Static knowledge encoding
Description of current Quasimodo/ConceptNet encoding coming soon
Event encoding
We use Neo-Davidsonian encoding with semantic roles:
- actor (subject)
 - patient (object)
 - ...
 
Event type is the verb that describes the event.
Example: "Brutus stabbed Caesar in the agora"
event_subject(brutus, ev1). event_object(caesar, ev1). event_type(stab, ev1). event_location(agora, ev1).
Connecting Static Knowledge to Events
This is mostly unsolved. This minimal example may help get things started:
"Did grape juice turn into wine?"
event_subject(grape_juice, ev1). event_type(turn_into, ev1).
There are multiple ways of encoding that this is a question, for example:
event_object(wine, ev1) => $ans(yes).
Assuming we have commonsense knowledge about fermenting grape juice:
be(grape_juice, X) => ovs(wine, turn_into, X). % reflexivity be(X, X).
Proposal SVO triples can be connected to events like this:
ovs(Z, Y, X) & event_type(Y, W) & event_subject(X, W) => event_object(Z, W).
This example does not fully make sense yet, since the event itself lacks context. Work in progress.
High level steps for constructing a logical form
Construction of logical form consists of the following steps:
-  Finding predicates and specify their arguments (number, type)
- Concepts and events - predicate/1
 - Roles - predicate/2
 
 - Constructing corresponding atoms
 - Dividing atoms on same level into groups
 - Specifying connectives between atoms of each group and construct corresponding formulas.
 - Dividing formulas and/or any of the remaining atoms of the same level into groups. If there are no groups go to step 7
 - Specifyng connectives between elements of each group
 - Specifying quantifers for the variables.
 - Constructing the final FOL formula.
 
Identifying the predicates
(From Jurafsky: 15.4 "Event and State Representation")
- Events are captured with predicates that take single event variable as an argument. Events are denoted by verbs.
 - There is no need to specifiy a fixed number of arguments for a given FOL predicate: as many roles and fillers can be glued on
 - No more roles are postulated than are mentioned in input.
 - The logical connections between closely related inputs that share same predicate are satisfied without the need for additional inference.
 - Syntactic arguments form the arguments of semantic predicates.
 
Encoding of reasons why something does not have normal capabilities
[
// classes have themselves as classes
["be", "?:P", "?:P"],
// taxonomy
[["be", "bird", "?:X1"], "=>" ,["be", "organism", "?:X1"]],
[["be", "organism", "?:X1"], "=>" ,["be", "object", "?:X1"]],
// default parts (hasa) and capabilities of birds, airplanes, helicopters and generic objects
[["be", "bird", "?:X1"], "=>", [["hasa", "wing", "?:X1"],"|",["$block", 10000,  ["$not", ["hasa", "wing", "?:X1"]]]]],
[["be", "bird", "?:X1"], "=>", [["capability", "fly", "?:X1"],"|",["$block", 1000, ["$not",["capability", "fly", "?:X1"]]]]],
[["be", "airplane", "?:X1"], "=>", [["hasa", "wing", "?:X1"],"|",["$block", 10000,  ["$not", ["hasa", "wing", "?:X1"]]]]],
[["be", "airplane", "?:X1"], "=>", [["capability", "fly", "?:X1"],"|",["$block", 1000, ["$not",["capability", "fly", "?:X1"]]]]],
[["be", "helicopter", "?:X1"], "=>", [["hasa", "rotor", "?:X1"],"|",["$block", 10000,  ["$not", ["hasa", "rotor", "?:X1"]]]]],
[["be", "helicopter", "?:X1"], "=>", [["capability", "fly", "?:X1"],"|",["$block", 1000, ["$not",["capability", "fly", "?:X1"]]]]],
[["be", "object", "?:X1"], "=>", [["-hasa", "wing", "?:X1"],"|",["$block", 10, ["hasa", "wing", "?:X1"]]]],
[["be", "object", "?:X1"], "=>", [["-hasa", "rotor", "?:X1"],"|",["$block", 10, ["hasa", "rotor", "?:X1"]]]],
[["be", "object", "?:X1"], "=>", [["-capability", "fly", "?:X1"],"|",["$block", 1, ["capability", "fly", "?:X1"]]]],
// concepts have unconditionally some parts
//[[["be", "helicopter", "?:X1"], "&", ["concept", "?:X1"]], "=>", ["hasa", "rotor", "?:X1"]],
//{"@role": "axiom", "@logic": [["-be", "bird", "?:O"], ["-hasa", "wing", "bird"], ["hasa","wing","?:O"], ["-capability","fly","?:O"]] },
//{"@role": "axiom", "@logic": [["-be", "?:P", "?:O"], ["-hasa", "wing", "?:P"], ["hasa","wing","?:O"], ["-capability","fly","?:O"]] },
/*
{"@role": "axiom", "@logic": [["-be", "?:P", "?:O"], ["-capability","fly","?:P"], ["-hasa", "wing", "?:P"], ["hasa","wing","?:O"], ["-capability","fly","?:O"], ["$block", 20000, ["capability", "fly", "?:O"]]] },
{"@role": "axiom", "@logic": [["-be", "?:P", "?:O"], ["-capability","fly","?:P"], ["-hasa", "rotor", "?:P"], ["hasa","rotor","?:O"], ["-capability","fly","?:O"], ["$block", 20000, ["capability", "fly", "?:O"]]] },
{"@role": "axiom", "@logic": [["-be", "?:P", "?:O"], ["-capability","fly","?:P"], ["-hasa", "balloon", "?:P"], ["hasa","balloon","?:O"], ["-capability","fly","?:O"], ["$block", 20000, ["capability", "fly", "?:O"]]] },
*/
// if a class has some capability and a specific part which is used for this capability, then an instance of a class 
// without this part does not have that capability
{"@role": "axiom", 
 "@confidence": 90, 
 "@logic": [["-be", "?:P", "?:O"], ["-hasa", "?:PART", "?:P"], ["-usedfor", "?:C", "?:PART"], //["-concept","?:P"], ["concept","?:O"], // ["-capability","?:C","?:P"], 
            ["hasa","?:PART","?:O"], 
            ["-capability","?:C","?:O"], 
            ["$block", 20000, ["capability", "?:C", "?:O"]]] },
            
// similar to the previous rule, but an instance of a part is present and is nonfunctional
            
           
{"@role": "axiom", 
 "@confidence": 80, 
 "@logic": [["-be", "?:P", "?:O"], ["-hasa", "?:PART", "?:P"], ["-usedfor", "?:C", "?:PART"], ["concept","?:PI"], // ["-concept","?:P"], ["concept","?:O"], // ["-capability","?:C","?:P"], 
            ["-hasa", "?:PI", "?:O"], ["-be","?:PART","?:PI"], ["-property","nonfunctional","?:PI"],
            ["-capability","?:C","?:O"], 
            ["$block", 20000, ["capability", "?:C", "?:O"]]] },   
            
// similar to the previous rule, but all instances of this type of the object are nonfunctional
/*           
 The forall part is to be negated, hence also skolemized:
            
.... [forall sk. [((haspart sk O) & (be PART sk)) =>  (property nonfunctional sk)]] .... => (cannotfly O)          
          
*/
            
{"@role": "axiom", 
 "@confidence": 90, 
 "@logic": [["-be", "?:P", "?:O"], ["-hasa", "?:PART", "?:P"], ["-usedfor", "?:C", "?:PART"],  //["-concept","?:P"], ["concept","?:O"], // ["-capability","?:C","?:P"], 
            //["hasa", ["sk1", "?:P", "?:O", "?:C", "?:PART"], "?:O"], ["be","?:PART",["sk1", "?:P", "?:O", "?:C", "?:PART"]], 
            ["hasa", ["sk1", "?:P", "?:O", "?:C", "?:PART"],  "?:O"], //["be","?:PART", "sk1"], 
            ["-capability","?:C","?:O"], 
            ["$block", 20000, ["capability", "?:C", "?:O"]]] },  
            
{"@role": "axiom", 
 "@confidence": 90, 
 "@logic": [["-be", "?:P", "?:O"], ["-hasa", "?:PART", "?:P"], ["-usedfor", "?:C", "?:PART"],  //["-concept","?:P"], ["concept","?:O"], // ["-capability","?:C","?:P"], 
            //["hasa", ["sk1", "?:P", "?:O", "?:C", "?:PART"], "?:O"], ["be","?:PART",["sk1", "?:P", "?:O", "?:C", "?:PART"]], 
            ["be","?:PART", ["sk1", "?:P", "?:O", "?:C", "?:PART"]], 
            ["-capability","?:C","?:O"], 
            ["$block", 20000, ["capability", "?:C", "?:O"]]] },  
            
            
{"@role": "axiom", 
 "@confidence": 90, 
 "@logic": [["-be", "?:P", "?:O"], ["-hasa", "?:PART", "?:P"], ["-usedfor", "?:C", "?:PART"],  //["-concept","?:P"], ["concept","?:O"], // ["-capability","?:C","?:P"], 
            //["-property","nonfunctional",["sk1", "?:P", "?:O", "?:C", "?:PART"]],
            ["-property","nonfunctional",["sk1", "?:P", "?:O", "?:C", "?:PART"]],
            ["-capability","?:C","?:O"], 
            ["$block", 20000, ["capability", "?:C", "?:O"]]] },  
            
                 
            
// several things used for flying                              
                              
["usedfor", "fly", "wing"],
["usedfor", "fly", "rotor"],
["usedfor", "fly", "balloon"],
// concept stuff            
/*
["concept","bird"],    
["concept","airplane"],
["concept","helicopter"],
["concept","organism"], 
["concept","object"], 
//[["-concept","?:X"],["$block",0,["concept","?:X"]]],
                       
["-concept", "birdx1"],
["-concept", "birdx2"],
["-concept", "planex1"],
["-concept", "planex2"],
["-concept", "helix1"],            
["-concept", "helix2"],            
*/           
// concrete 
// birds birdx1 and birdx2                              
// airplanes planex1, planex2 and planex3
// helicopters helix1 and helix2
{"@role": "assumption", "@logic": ["be","bird","birdx1"]},
{"@role": "assumption", "@logic": ["be","bird","birdx2"]},
{"@role": "assumption", "@logic": ["be","airplane","planex1"]},
{"@role": "assumption", "@logic": ["be","airplane","planex2"]},
{"@role": "assumption", "@logic": ["be","airplane","planex3"]},
{"@role": "assumption", "@logic": ["be","helicopter","helix1"]},
{"@role": "assumption", "@logic": ["be","helicopter","helix2"]},
// birdx2 is an exemplar of a class of nonwingedbird
{"@role": "assumption", "@logic": ["be","nonwingedbird","birdx2"]},
[["be", "nonwingedbird", "?:X1"], "=>" ,["be", "bird", "?:X1"]],
[["be", "nonwingedbird", "?:X1"], "=>" ,["-hasa", "wing", "?:X1"]],
// defective things are nonfunctional
[["property","defective","?:X"], "=>" , ["property","nonfunctional","?:X"]],
// planex2 has a defective wing
["hasa", "wingx2", "planex2"],
["be", "wing", "wingx2"],
["-concept", "wingx2"],
["property","defective","wingx2"],
// all wings of planex3 are defective 
[["-hasa", "?:P", "planex3"],  ["-be", "wing", "?:P"], ["property","defective","?:P"]],
// helix2 does not have a rotor
["-hasa", "rotor", "helix2"],
// question
{"@question": ["capability","fly","?:X"]}
//{"@question": [["capability","fly","?:X"],"&",["-concept","?:X"]]}
]