Skip to content

Concepts ​

Logic programming is built on a few key concepts, which we frequently encounter when writing code. To illustrate these concepts, let's consider an example using a salary table.

First NameLast NameDepartmentSalary
RobertSmithMarketing8500
JaneDoeEngineering8000
AliceJohnsonSales7500

Facts ​

In Logica, a fact is a fundamental assertion about the world. Facts are the simplest form of logical statements and serve as the foundation for reasoning in a logic program. They consist of predicates applied to constant values, representing known relationships or properties.

In the previous tutorials, both Greeting("Hello World!"); and Human("Socrates"); are facts. If we want to use logic programming scripts to query or reason over a given dataset, the provided inputs usually serve as the facts.

If we use the table Salary, we can write all the information in logic format

Salary("Robert", "Smith", "Marketing", 8500);
Salary("Jane", "Doe", "Engineering", 8000);
Salary("Alice", "Johnson", "Sales", 7500);

In Logica, you specify at execution which predicate you would like to produce. To see the table of the parent relationship, you would run

$ logica salary.l run Salary

and get:

+--------+---------+-------------+------+
| col0   | col1    | col2        | col3 |
+--------+---------+-------------+------+
| Robert | Smith   | Marketing   | 8500 |
| Jane   | Doe     | Engineering | 8000 |
| Alice  | Johnson | Sales       | 7500 |
+--------+---------+-------------+------+

Predicates ​

A predicate is a statement with variables. In Salary("Robert", "Smith", "Marketing", 8500);, we know Salary is a predicate, which usually corresponds to a relationship or an entity.

TIP

Logica uses Pascal case for predicates.

Variables ​

Sometimes, we can use letters to represent values. For example, we use x, y, m, n to represent the relationship in Salary(x, y, m, n). In such cases, these letters are called variables, which usually correspond to columns in a table.

TIP

Logica uses snake case for variables.

Values ​

In the provided example, everything following the variables such as "Robert", "Smith", "Marketing", 8500 are the values.

Atom ​

Although we don't usually use atoms in the context of Logica, they are also a key concept in logic programming. Facts are grounded atoms and are always true. An atom can include variables, so Salary(x, y, m, n) is an atom but not a fact. Thus, every fact is an atom, but not all atoms are facts.

To further demonstrate the concept, let's have a dataset (facts):

Parent("Adam", "Abel");
Parent("Philip of Macedon", "Alexander of Macedon");

and an atom Parent(x, y) which stands for "x is a parent of y". Then:

  • Parent("Adam", "Abel") is true.
  • Parent("Philip of Macedon", "Alexander of Macedon") is true.
  • Parent("Philip of Macedon", "Julius Caesar") is false.

TIP

Facts cannot be used in rules and are usually represented by atoms.

Literal ​

A literal is an atom or its negation. For instance, Salary(x, y, m, n) is both an atom and a literal, however not Salary(x, y, m, n) is a literal and not an atom. Literals are used in rules to express conditions that must be met for the rule to apply.