Ejemplo n.º 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("======");
 }
Ejemplo n.º 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("======");
 }
Ejemplo n.º 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"))));
     }));
 }
Ejemplo n.º 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("======");
 }
Ejemplo n.º 5
0
        public static Goal AllOne(this KRunner k, object lst)
        {
            var d = k.Fresh();

            return(k.Any(
                       k.Eq(lst, null),
                       k.All(
                           k.Eq(lst, k.Pair(1, d)),
                           k.Recurse(() => k.AllOne(d)))));
        }
Ejemplo n.º 6
0
 public static Goal Noto(this KRunner k, params Goal[] gs)
 {
     if (gs.Length == 0)
     {
         return(k.Succeed);
     }
     if (gs.Length == 1)
     {
         return(k.If(gs[0], k.Fail, k.Succeed));
     }
     return(k.All(gs.Select(g => k.Noto(g)).ToArray()));
 }
Ejemplo n.º 7
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)]
 }
Ejemplo n.º 8
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)]
 }
Ejemplo n.º 9
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]
        }
Ejemplo n.º 10
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("======");
 }
Ejemplo n.º 11
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))));
     }));  // 输出[]
 }
Ejemplo n.º 12
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("======");
 }
Ejemplo n.º 13
0
        public static Goal Distincto(this KRunner k, params object[] vs)
        {
            if (vs.Length < 2)
            {
                return(k.Succeed);
            }
            if (vs.Length == 2)
            {
                return(k.Noto(k.Eq(vs[0], vs[1])));
            }
            var gs = Enumerable.Empty <Goal>().ToList();

            for (var i = 0; i < vs.Length; ++i)
            {
                for (var j = i + 1; j < vs.Length; ++j)
                {
                    gs.Add(k.Noto(k.Eq(vs[i], vs[j])));
                }
            }
            return(k.All(gs.ToArray()));
        }
Ejemplo n.º 14
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("======");
 }
Ejemplo n.º 15
0
 public static Goal Is(this KRunner k, FreshVariable v, KPair set)
 {
     return(k.Membero(v, set));
 }
Ejemplo n.º 16
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);
        }