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)
有关更全面的解释:
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还对结果列表进行排序