Пример #1
0
 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("======");
 }
Пример #2
0
 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("======");
 }
Пример #3
0
 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"))));
     }));
 }
Пример #4
0
 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("======");
 }
Пример #5
0
 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)]
 }
Пример #6
0
 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)]
 }
Пример #7
0
        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]
        }
Пример #8
0
 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("======");
 }
Пример #9
0
 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))));
     }));  // 输出[]
 }
Пример #10
0
 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("======");
 }
Пример #11
0
 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("======");
 }
Пример #12
0
        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);
        }