28

我正在编写一些我不熟悉的序言。

我正在寻找“或”运算符

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

这是我的查询。我想写的是这样的代码:

“返回 X,假设 Y 等于值 Z 或值 Q 或值 P”

如果 Y 等于所有 3,我要求它返回 X。这里的 or 运算符是什么?有吗?

4

2 回答 2

36

只是另一种观点。在 Prolog 中执行“或”也可以使用“分离”运算符或分号:

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

更全面的解释:

Prolog 中的谓词控制

于 2012-11-23T08:16:56.543 回答
20

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

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

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

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

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

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

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

或更紧凑的

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

findall/3 以与 register/2 成功相同的顺序构建列表。然后我使用排序来确保匹配。

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

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

于 2012-11-22T06:12:40.923 回答