Prolog-当不使用输入变量时,谓词无法找到所有解决方案

时间:2019-03-09 17:39:25

标签: prolog

这是我的问题。

我的事实和规则:

[HttpGet]
        public ActionResult AddProperty()
        {
            PropertyVM obj = new PropertyVM();
            obj.pt_list = db.property_type.Where(pt => pt.property_type_status == 1).ToList();
            obj.pst_list = db.property_sub_type.Where(pst => pst.property_sub_type_status == 1).ToList();

            return View(obj);
        }

现在,如果我问SWI-Prolog fact1(green, red, blue). fact1(purple, white, gray). fact2(green, orange). fact2(purple, cyan). fact3(green, pink). fact3(purple, black). foo(A,B,C,D,E) :- fact1(A,B,C), fact2(A,D), fact3(A,E), write(A), write(B). ,输出为

foo(A,B,C,D,E).

我的目标是用户只能看到线条

?- foo(A,B,C,D,E).
greenred
A = green, B = red, C = blue, D = orange, E = pink ;
purplewhite
A = purple, B = white, C = gray, D = cyan, E = black.

为了实现这一点,我尝试像这样更改greenred purplewhite 的定义:

foo

但是此谓词的输出仅为:

foo() :-
   fact1(A,B,C),
   fact2(A,D),
   fact3(A,E),
   write(A),
   write(B).

不是我所期望的:

?- foo().
greenred
true.

非常欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

在末尾添加fail/0会将其调整为failure driven loop,以便一旦给出答案,谓词就会失败并尝试其他选择点。

foo :-
    fact1(A,B,_),
    fact2(A,_),
    fact3(A,_),
    write(A),
    write(B),
    nl,
    fail.

示例运行。

?- foo.
greenred
purplewhite
false.

要使Prolog返回真实值,(在后台,一个邪恶的声音说:“我们有办法让您给我们提供真相”),它必须在失败后才能成功,因此Prolog会寻找另一个名为{{1 }}。通过仅添加foo作为第二个子句,Prolog现在可以找到该子句并执行它。由于它什么都不做,因此成功并返回foo.

true.

示例运行

foo.

完整的源代码

?- foo.
greenred
purplewhite
true.