Prolog"或"运算符,查询

Eog*_*oud 22 syntax logic operators prolog

我正在做一些我不熟悉的序言.

我正在寻找一个"或"运营商

registered(X, Y), Y=ct101, Y=ct102, Y=ct103.
Run Code Online (Sandbox Code Playgroud)

这是我的查询.我想写的代码是:

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

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

Rob*_*ler 29

只是另一种观点.在Prolog中执行"或"也可以使用"disjunct"运算符或分号来完成:

registered(X, Y) :-
    X = ct101; X = ct102; X = ct103.
Run Code Online (Sandbox Code Playgroud)

有关更全面的解释:

Prolog中的谓词控制


Cap*_*liC 14

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

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).
Run Code Online (Sandbox Code Playgroud)

请注意,需要括号来保持正确的执行控制流程.该;/ 2这是一般的or运营商.对于您的限制使用,你可以选择更惯用的

...registered(X, Y), member(Y, [ct101,ct102,ct103]).
Run Code Online (Sandbox Code Playgroud)

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

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

...registered(X, ct101), registered(X, ct102), registered(X, ct103).
Run Code Online (Sandbox Code Playgroud)

或者更紧凑

...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]).
Run Code Online (Sandbox Code Playgroud)

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

...setof(Y, registered(X, Y), [ct101,ct102,ct103]).
Run Code Online (Sandbox Code Playgroud)

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