Skip to content
Minikanren implemented in dart language based on logic.js repository.
Dart
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
example
lib
test
.gitignore
.travis.yml
CHANGELOG.md
LICENSE
README.md
analysis_options.yaml
pubspec.yaml

README.md

logic.dart

This is a practice project of porting logic.js (minikanren) to dart.

Usages

Core

lvar, run, and, or, eq

import "package:logic/logic.dart";

final x = lvar("x"); // define logic variable with id 'x'

run([x], eq(x, 1)); // query 'x' => [{x: 1}]
run([x], () {
  final y = lvar("y");
  return and(
    eq(y, 1),
    eq(x, y));
}); // => [{x: 1}]

run([x], or(eq(x, 1), eq(x, 2)));    // [{x: 1}, {x: 2}]
run([x], or(eq(x, 1), eq(x, 2), count: 1)); // [{x: 1}]
run([x], or(eq(x, 1), eq(x, 2)), count: 1); // [{x: 1}]

Facts

facts

// FACTS
final parent = facts([
  ['Steve', 'Bob'],      // Steve is Bob's parent
  ['Steve', 'Henry'],    // Steve is Henry's parent
  ['Henry', 'Alice']     // Henry is Alice's parent
]);
run([x], parent(x, 'Alice'));     // who is Alice's parent => ['Henry']
run([x], parent('Steve', x));     // who are Steve's children => ['Bob', 'Henry']

// RULES
var grandparent = (x, y) {
  final z = lvar();
  return and(parent(x, z), parent(z, y));
};

run([x], grandparent(x, 'Alice'));  // who is Alice's grandparent => ['Steve']

Array manipulation

conso, firsto, resto, emptyo, membero, appendo

final x = lvar('x');
final y = lvar('y');

run([x], membero(x, [1, 2, 3]));
// [{x: 1}, {x: 2}, {x: 3}]

run([x, y], conso(x, y, [1, 2, 3]));
// [{x: 1, y: [2, 3]}]

run([x, y], appendo(x, y, [1, 2]));
/*
[ {x: [], y: [1, 2]},
  {x: [1], y: [2]}
  {x: [1, 2], y: []} ]
*/

Arithmetic & Comparison

add, sub, mul, div, lt, le, gt, ge

run([x], add(2, x, 5));
// [{x: 3}]

Extra

succeed, fail, anyo

run([x], and(eq(x, 1), succeed()));
// [{x: 1}]

run([x], and(eq(x, 1), fail()));
// []

run([x], or(
  eq(x, 1),
  eq(x, 2),
  eq(x, 3)
)); // [{x: 1}, {x: 2}, {x: 3}]

run([x], or(
  eq(x, 1),
  and(eq(x, 2), fail()),
  eq(x, 3)
)); // [{x: 1}, {x: 3}]

run([x], anyo(or(eq(x, 1), eq(x, 2), eq(x, 3))), count: 4);
// [{x: 1}, {x: 2}, {x: 3}, {x: 1}]

Summary

I encountered a few problems while rewriting the logic.js to logic.dart.

  • The dart language doesn't support variadic functions. So I hacked the and and or functions. #16253.

  • ...

References

logic.js

You can’t perform that action at this time.