这是我的问题。
我的事实和规则:
[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.
非常欢迎任何帮助。
答案 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.