【问题标题】:Prolog "or" operator, queryProlog“或”运算符,查询
【发布时间】:2012-11-10 11:45:10
【问题描述】:

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

我正在寻找“或”运算符

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

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

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

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

【问题讨论】:

    标签: syntax prolog operators logic


    【解决方案1】:

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

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

    更全面的解释:

    Predicate control in Prolog

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      edit 我延迟理解了您的最后一个要求。如果您希望 Y 匹配 all 3 个值 or 不合适,请改用

      ...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 也对结果列表进行排序

      【讨论】:

      • 谢谢,这帮助了很多。我不知道该怎么做,但我会阅读绑定和回溯。赞赏!
      猜你喜欢
      • 2010-11-27
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2023-03-22
      • 2014-01-30
      相关资源
      最近更新 更多