choicelogics
This Code is a practical implementation of Bernreiter, Michael, Jan Maly, and Stefan Woltran. "Choice logics and their computational properties." Artificial Intelligence 311 (2022): 103755
This npm package provides a general framework for choice logics. It offers a flexible and extensible foundation for preference modeling and reasoning, encapsulating various choice logics, including Qualitative Choice Logic (QCL) and Conjunctive Choice Logic (CCL), while allowing the definition of new ones.
Installation
To install the package, use npm:
npm install choicelogics
Usage
Importing the Module
import { QCCL, PropositionalLogic, ChoiceResult, normalizeChoiceResult, choiceResultToBool, boolToChoiceResult, validateChoiceResult } from "choicelogics";
Example
const a: ChoiceResult = { degree: 2, optionality: 1 };
const b: ChoiceResult = { degree: Infinity, optionality: 2 };
const result1 = QCCL.orderedDisjunction(a, b);
console.log(result1);
const result2 = PropositionalLogic.and(a, b);
console.log(result2);
const boolResult = choiceResultToBool(a);
console.log(boolResult);
const choiceResult = boolToChoiceResult(false);
console.log(choiceResult);
const isValid = validateChoiceResult(a);
console.log(a)
API
Classes
QCCL (Extends PropositionalLogic)
A combination of QCL and CCL
static orderedDisjunction(a: ChoiceResult, b: ChoiceResult): ChoiceResult
static orderedConjunction(a: ChoiceResult, b: ChoiceResult): ChoiceResult
PropositionalLogic
static and(a: ChoiceResult, b: ChoiceResult): ChoiceResult
static or(a: ChoiceResult, b: ChoiceResult): ChoiceResult
static negation(a: ChoiceResult): ChoiceResult
Types
ChoiceResult
type ChoiceResult = {
degree: number;
optionality: number;
};
ConnectiveFunction
type ConnectiveFunction = (a: ChoiceResult, b: ChoiceResult) => ChoiceResult;
ModifierFunction
type ModifierFunction = (a: ChoiceResult) => ChoiceResult;
ConnectMultipleFunction
type ConnectMultipleFunction = (...args: ChoiceResult[]) => ChoiceResult;
Util Functions
normalizeChoiceResult(result: ChoiceResult): ChoiceResult
boolToChoiceResult(value: boolean): ChoiceResult
choiceResultToBool(result: ChoiceResult): boolean
validateChoiceResult(result: ChoiceResult): boolean
Extending the Logic
You can extend the existing logic by inheriting from the provided classes and using the function types ConnectiveFunction, ModifierFunction, and ConnectMultipleFunction. Here is an example of how to create a new logic class by extending PropositionalLogic:
import { PropositionalLogic, ChoiceResult, ConnectiveFunction, ModifierFunction } from "choicelogics";
class CustomLogic extends PropositionalLogic {
public static customOperation: ConnectiveFunction = (a, b) => {
return {
degree: a.degree + b.degree,
optionality: a.optionality * b.optionality,
};
};
public static customModifier: ModifierFunction = (a) => {
return {
degree: a.degree * 2,
optionality: a.optionality * 2,
};
};
}
const a: ChoiceResult = { degree: 2, optionality: 1 };
const b: ChoiceResult = { degree: 3, optionality: 2 };
const result = CustomLogic.customOperation(a, b);
console.log(result);
const modifierResult = CustomLogic.customModifier(a);
console.log(negationResult);
License
This project is licensed under the ISC License.