Syntax 序言;或;操作员,查询

Syntax 序言;或;操作员,查询,syntax,prolog,operators,logic,Syntax,Prolog,Operators,Logic,我正在写一些我不熟悉的序言 我在找“或”接线员 这是我的问题。我想写的代码将: 如果Y等于值Z或值Q或值p,则返回X 如果Y等于所有3,我要求它返回X。这里的or运算符是什么?有吗 您可以通过以下方式在Y上“调用”替代绑定: ...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103). 注意:括号是保持正确的执行控制流所必需的。/2它是通用的或运算符。对于你有限的用途,你最好选择更地道的 ...registered(X, Y), member(Y, [ct

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

我在找“或”接线员

这是我的问题。我想写的代码将:

如果Y等于值Z或值Q或值p,则返回X


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

您可以通过以下方式在
Y
上“调用”替代绑定:

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).
注意:括号是保持正确的执行控制流所必需的。
/2它是通用的
运算符。对于你有限的用途,你最好选择更地道的

...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还将结果列表排序为另一个视点。也可以使用“disjunct”运算符或分号在序言中执行“or”:

registered(X, Y) :-
    X = ct101; X = ct102; X = ct103.
要获得更全面的解释:


谢谢,这帮了大忙。我不知道该怎么做,但我将阅读绑定和回溯。谢谢!
registered(X, Y) :-
    X = ct101; X = ct102; X = ct103.