public void TestEq0() { Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Eq(q, 5)); })); // 输出[5] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Eq(q, k.List(1, 2))); })); // 输出[(1 2)] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Eq(k.List(1, q), k.List(1, 2))); })); // 输出[2] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Eq(k.List(2, q), k.List(1, 2))); })); // 输出[] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Fail); })); // 输出[] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Succeed); })); // 输出[_0] Console.WriteLine("======"); }
public void TestSeq() { Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Any(k.Eq(x, 1), k.Eq(x, 2)), k.Any(k.Eq(y, "a"), k.Eq(y, "b")), k.Eq(q, k.List(x, y)))); })); // 输出[(1 a), (1 b), (2 a), (2 b)] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.Alli( k.Any(k.Eq(x, 1), k.Eq(x, 2)), k.Any(k.Eq(y, "a"), k.Eq(y, "b")), k.Eq(q, k.List(x, y)))); })); // 输出[(1 a), (2 a), (1 b), (2 b)] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Any(k.Eq(x, 1), k.Eq(x, 2), k.Eq(x, 3)), k.Any(k.Eq(y, "a"), k.Eq(y, "b")), k.Eq(q, k.List(x, y)))); })); // 输出[(1 a), (1 b), (2 a), (2 b), (3 a), (3 b)] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.Alli( k.Any(k.Eq(x, 1), k.Eq(x, 2), k.Eq(x, 3)), k.Any(k.Eq(y, "a"), k.Eq(y, "b")), k.Eq(q, k.List(x, y)))); })); // 输出[(1 a), (2 a), (1 b), (3 a), (2 b), (3 b)] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Any( k.Any(k.Eq(q, 1), k.Eq(q, 2)), k.Any(k.Eq(q, 3), k.Eq(q, 4)))); })); // 输出[1, 2, 3, 4] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Anyi( k.Any(k.Eq(q, 1), k.Eq(q, 2)), k.Any(k.Eq(q, 3), k.Eq(q, 4)))); })); // 输出[1, 3, 2, 4] Console.WriteLine("======"); }
public void TestMembero() { KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.All( k.Membero(q, k.List("a", "b", "c")), k.Membero(q, k.List("a", "c", "f")))); })); }
public void TestIf() { Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); return(k.All( k.Eq(x, 1), k.If( k.Eq(x, 1), k.Eq(q, 2), k.Eq(q, 3)))); })); // 输出[2] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Eq(x, 1), k.Eq(y, 2), k.If( k.Eq(x, 1), k.Eq(x, y), k.Succeed), k.Eq(q, k.List(x, y)))); })); // 输出[] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Eq(x, 1), k.Eq(y, 2), k.If( k.Eq(x, y), k.Eq(x, 1), k.Succeed), k.Eq(q, k.List(x, y)))); }));; // 输出[(1 2)] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.If( k.Eq(x, y), k.Eq(x, 1), k.Succeed), k.Eq(x, 1), k.Eq(y, 2), k.Eq(q, k.List(x, y)))); }));; // 输出[] Console.WriteLine("======"); }
public void TestUnif() { KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Eq(y, x), k.Eq(q, k.List(x, y)), k.Eq(x, 1))); })); // 输出[(1 1)] }
public void TestSample() { KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Any(k.Eq(x, 1), k.Eq(x, 2)), k.Any(k.Eq(y, x), k.Eq(y, "b")), k.Eq(q, k.List(x, y)))); })); // 输出[(1 1), (1 b), (2 2), (2 b)] }
public void TestEq1() { // k提供NMiniKanren的方法,q是待求解的未知变量。 var res = KRunner.Run(1 /* 输出1个结果 */, (k, q) => { // q == 5 或者 q == 6 return(k.Any( k.Eq(q, 5), k.Eq(q, 6))); }); KRunner.PrintResult(res); // 输出结果:[5] }
public void TestTree() { Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Eq( k.List(1, k.List(2, 3), 4), k.List(1, k.List(x, 3), y)), k.Eq(q, k.List(x, y)))); })); Console.WriteLine("======"); }
public void TestAll1() { KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.AllOne(k.List(1, x, y, 1)), k.Eq(q, k.List(x, y)))); })); // 输出[(1 1)] KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.AllOne(k.List(1, x, y, 0)), k.Eq(q, k.List(x, y)))); })); // 输出[] }
public void TestOr() { Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.Any( k.Eq(q, 5), k.Eq(q, 6))); })); // 输出[5, 6] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Any(k.Eq(x, 5), k.Eq(y, 6)), k.Eq(q, k.List(x, y)))); })); // 输出[(5 _0), (_0 6)] Console.WriteLine("======"); }
public void TestAnd() { Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { return(k.All( k.Eq(q, 1), k.Eq(q, 2))); })); // 输出[] Console.WriteLine("======"); KRunner.PrintResult(KRunner.Run(null, (k, q) => { var x = k.Fresh(); var y = k.Fresh(); return(k.All( k.Eq(x, 1), k.Eq(y, x), k.Eq(q, k.List(x, y)))); })); // 输出[(1 1)] Console.WriteLine("======"); }
public void FindMurderer() { var George = "George"; var John = "John"; var Rebert = "Rebert"; var Barbara = "Barbara"; var Christine = "Christine"; var Yolanda = "Yolanda"; var res = KRunner.Run(null, (k, q) => { // 男人集合 var manNames = new string[] { George, John, Rebert }; var man = k.List(manNames); // 女人集合 var womanNames = new string[] { Barbara, Christine, Yolanda }; var woman = k.List(womanNames); // 所有人集合 var person = k.List(manNames.Concat(womanNames).ToArray()); // 每个场所所在的人 var bathroom = k.Fresh(); var dining = k.Fresh(); var kitchen = k.Fresh(); var livingroom = k.Fresh(); var pantry = k.Fresh(); var study = k.Fresh(); // 物品持有者 var bag = k.Fresh(); var firearm = k.Fresh(); var gas = k.Fresh(); var knife = k.Fresh(); var poison = k.Fresh(); var rope = k.Fresh(); // 不同的人在不同的房间 var locationConst = k.Distincto(bathroom, dining, kitchen, livingroom, pantry, study); // 不同的人持有的物品不同 var weaponConst = k.Distincto(bag, firearm, gas, knife, poison, rope); // 变量X表示凶手 var X = k.Fresh(); // 线索 var clue1 = k.All( k.Is(kitchen, man), k.Noto(k.Eq(kitchen, rope), k.Eq(kitchen, knife), k.Eq(kitchen, bag), k.Eq(kitchen, firearm))); var clue2 = k.Any( k.All(k.Eq(bathroom, Barbara), k.Eq(study, Yolanda)), k.All(k.Eq(bathroom, Yolanda), k.Eq(study, Barbara))); var clue3 = k.Noto( k.Eq(bag, Barbara), k.Eq(bag, George), k.Eq(bag, bathroom), k.Eq(bag, dining)); var clue4 = k.All(k.Is(rope, woman), k.Eq(rope, study)); var clue5 = k.Any(k.Eq(livingroom, John), k.Eq(livingroom, George)); var clue6 = k.Noto(k.Eq(knife, dining)); var clue7 = k.Noto(k.Eq(study, Yolanda), k.Eq(pantry, Yolanda)); var clue8 = k.Eq(firearm, George); var clue9 = k.All(k.Eq(X, pantry), k.Eq(X, gas)); return(k.All( k.Is(X, person), k.Is(bathroom, person), k.Is(dining, person), k.Is(kitchen, person), clue5, k.Is(livingroom, person), k.Is(pantry, person), k.Is(study, person), clue2, locationConst, k.Is(bag, person), k.Is(firearm, person), clue8, k.Is(gas, person), k.Is(knife, person), k.Is(poison, person), k.Is(rope, person), weaponConst, clue1, clue3, clue4, clue6, clue7, clue9, k.Eq(q, k.List( bathroom, dining, kitchen, livingroom, pantry, study, bag, firearm, gas, knife, poison, rope, X)))); }); Console.WriteLine("(bathroom dining kitchen livingroom pantry study bag firearm gas knife poison rope X)"); KRunner.PrintResult(res); }