Prolog“或”运算符,查询

时间:2012-11-22 05:47:43

标签: syntax prolog operators logic

我正在做一些我不熟悉的新闻。

我正在寻找"或"操作

registered(X, Y), Y=ct101, Y=ct102, Y=ct103.

这是我的疑问。我想写的代码是:

"返回X,假设Y等于值Z OR值Q OR值P"

如果Y等于全部3,我要求它返回X.这里的运营商是什么?有吗?

2 个答案:

答案 0 :(得分:26)

另一种观点。在Prolog中执行“或”也可以使用“disjunct”运算符或分号来完成:

registered(X, Y) :-
    X = ct101; X = ct102; X = ct103.

更全面的解释:

Predicate control in Prolog

答案 1 :(得分:14)

您可以通过这种方式Y'调用'替代绑定:

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).

请注意,必须使用括号来保持正确的执行控制流程。 ; / 2它是一般的or运算符。对于您的限制使用,您也可以选择更惯用的

...registered(X, Y), member(Y, [ct101,ct102,ct103]).

回溯时将Y绑定到列表的每个成员。

编辑我理解我的最后一项要求。如果您希望Y匹配所有 3值或不合适,请改用

...registered(X, ct101), registered(X, ct102), registered(X, ct103).

或更紧凑

...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]).

findall / 3按照注册/ 2成功的顺序构建列表。然后我使用sort来确保匹配。

...setof(Y, registered(X, Y), [ct101,ct102,ct103]).

setof / 3也对结果列表进行排序