术语列表的术语扩展

2023-12-13

假设我想要有许多遵循相同模式的规则。当我想通过显式列出所有可能的第一个参数来避免不确定性行为时,我遇到了这种情况。然而,我知道我需要对某些可能性做同样的事情。解决这个问题的一种方法是在末尾添加一个包罗万象的子句:

foo(a) :- /* do something */.
foo(b) :- /* do something else*/.
foo(_). /* ignore the rest */

但这不太好,因为我实际上无法知道是否收到了意外的输入,或者我的程序是否犯了错误。为了避免这种情况,我还可以说

foo(X) :- memberchk(X, [ /* list of possible values of X */ ]).

但我现在再次反对 Prolog 的确定性行为和当论证成立时的索引。

所以,相反,我做了这样的事情:

term_expansion(foos(Foos), Foo_rules) :-
    maplist(expand_foo, Foos, Foo_rules).

expand_foo(Foo, foo(Foo)).
other_foos([x,y,z]).

问题是,我试图找到这样的现有代码,但我找不到。是因为我做错了什么吗?有没有更好的方法来解决这个问题?或者完全规避它?

我不介意“你正在解决错误的问题”的答案。

编辑:一些谷歌搜索实际上让我从 SWI-Prolog 文档中找到了这个非常相似的示例:

http://www.swi-prolog.org/pldoc/man?section=ext-dquotes-motivation(在最底部)


首先对您已经建议的变体进行一些评论:

foo(a) :- /* do something */.
foo(b) :- /* do something else */.
foo(_).   /* ignore the rest */

主要问题是最后一个子句 (foo(_)) 适用于其他(可能更专业)条款also申请。所以查询?- foo(a).现在无意中是不确定的。

你说这个版本“不是很好,因为我实际上不知道是否得到了意外的输入,或者我的程序是否犯了错误”。我们可以通过确保在 check-all 子句中给定的术语不是意外的来防止意外输入:

foo(a) :- /* do something */.
foo(b) :- /* do something else */.
foo(X) :- must_be(oneof([a,b,x,y], X).

当该术语具有意外形式时,这会引发错误。我用了x and y作为未特别处理的术语的示例。注意a and b当然必须包括在内,因为该子句(再次)也适用于它们两者。即使实例化其参数,谓词仍然不是确定性的,因为第一个参数索引无法区分情况。您写道“我现在正在与 Prolog 的确定性行为和索引进行斗争,当论证成立时”,并且可能(并且正确地)意味着当您使用这种表示形式时,您无法从这些功能中受益。

现在是很好的声明式解决方案:每次您想引入“包罗万象”或“默认”子句时,请重新考虑您的数据表示形式,并为可以应用的不同情况引入区分函子。在您的示例中,两种情况是:

  1. 该术语需要以特殊方式处理
  2. 该术语无需做任何特殊处理。

我会用special(_) and ordinary(_)以区分情况。因此:

foo(special(S)) :- foo_special(S).
foo(ordinary(_)). % do nothing

foo_special(a) :- /* do something      */
foo_special(b) :- /* do something else */

这些谓词可以在所有方向上使用,并且当参数已知时是确定性的。可以轻松添加类型检查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

术语列表的术语扩展 的相关文章

  • 如何判断一个类型是否派生自模板类?

    如何确定类型是否派生自模板类 特别是 我需要确定模板参数是否具有std basic ostream作为基类 通常情况下std is base of是完成这项工作的工具 然而 std is base of仅适用于完整类型 不适用于类模板 我正
  • XCode iPhone 项目中目标所有配置的通用预处理器宏

    我的应用程序的每个目标通常有四种配置 调试 发布 分发 临时 有没有办法为所有 4 个添加一个通用宏 同时不破坏我到目前为止设置的宏 您在编辑器中看到 多个值 提前致谢 奥比旺 在前缀头文件中定义宏 将包含在所有源文件中
  • 将表达式捕获为 R 中的函数体

    我正在尝试编写一个程序 该程序将表达式作为输入并返回一个以该表达式绑定作为其主体的函数 caller lt function expr params Function lt function params body env parent f
  • 最有用的用户制作的 C 宏(在 GCC 中,还有 C99)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 __LINE__ 获取代码行

    我尝试使用以下方法打印当前代码的行号 include
  • CV_MAT_ELEM 中的编译错误

    调用estimateRigidTransform 的结果是我得到一个名为 trans 的cv Mat 对象 为了检索其包含的矩阵 我尝试以这种方式访问 其元素 for i 0 i lt 2 i for j 0 j lt 3 j mtx j
  • Prolog DCG:找到最后一个元素

    我正在尝试更好地理解 DCG 的用途 为了做到这一点 我尝试将 LearnPrologNow 书中的一些练习转换为 DCG 表示法 然而 我却失败得很惨 我试图编写一个程序 仅命名列表中的最后一个元素 就这样 我只是想不出正确的 DCG 语
  • 高阶“解决方案”谓词

    我正在使用一个更高阶的 Prolog 变体 它缺少findall 还有一个关于实现我们自己的问题findall here 获取 Prolog 中的解决方案列表 https stackoverflow com questions 419103
  • Prolog - 通过演绎减少知识库

    我需要创建一个规则来搜索与 my rule 匹配的事实 这些事实将用于改变知识库 my rule Conclusion Premise 我有这个知识库可以开始 dynamic is 2 is m1 house is m1 thing is
  • PHP 内部:TSRMLS_FETCH 如何工作?

    PHP 内部结构是怎样的TSRMLS FETCH宏发挥作用吗 Per the PHP手册 http php net manual en internals2 memory tsrm php 在开发扩展时 包含 tsrm ls is unde
  • 列表中小于给定数字的数字

    xMenores xMenores X H T R Z xMenores X T Z X gt H R is H xMenores采用三个参数 第一个是数字 第二个是数字列表 第三个是一个列表 是将包含结果的变量 规则的目标xMenores
  • 这个版本的trace有什么问题?

    我有这个跟踪元解释器 它是为 swi prolog 编写的 trace Goal trace Goal 0 trace true Depth true trace fail Depth fail trace A gt B Depth A g
  • Prolog:从哪里开始解决类似扫雷的难题?

    我需要在序言中写一些类似扫雷的东西 我能够用 正常 语言做到这一点 但是当我尝试用序言开始编码时 我完全不知道如何开始 我需要一些提示 输入规格 板尺寸 m n m n 1 16 三元组列表 i j k 在哪里i 1 m j 1 n k 1
  • 如何检查类中是否存在成员名称(变量或函数),无论是否指定类型? [复制]

    这个问题在这里已经有答案了 这个Q是以下内容的延伸 模板化检查类成员函数是否存在 https stackoverflow com q 257288 514235 是否有任何实用程序可以帮助找到 类中是否存在成员名称 该成员可以是 变量或方法
  • 查找列表中的最大值 - Prolog

    我刚刚接触 Prolog 并尝试编写一个谓词来查找整数列表的最大值 我需要写一个从头开始比较的内容 另一个从最后开始比较的内容 到目前为止 我有 max2 R max2 X Xs R X gt R max2 Xs X max2 X Xs R
  • C 相当于 C++ decltype

    在我的 C 项目中 有一个由另一位同事创建的结构体 其中包含一些函数指针 struct tools int tool a int int int 我无权更改此结构和相关文件 现在我正在使用该结构进行编码 我必须定义一个函数 其返回类型和参数
  • laravel 5 中 HTML 宏应该放在哪里?

    在 laravel 4 中 我曾经在多个视图中使用 HTML 宏 例如 HTML macro minipics function pic 为此我有一个macros php文件在 app文件夹 我找不到在 laravel 5 中放置宏的位置
  • WAM 中的扁平化形式

    WAM 教程重构指出查询 p Z h Z W f W 需要使用以下原则进行扁平化 话虽这么说 查询扁平化形式是 X3 h X2 X5 X4 f X5 X1 p X2 X3 X4 我对外部变量的定义感到困惑 请考虑以下内容 p Z h Y a
  • 将人员分配到床位 - 自动化方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我每年都会帮助举办青年营 将与会者分配到卧室是一项艰巨的任务 有 92 个卧室 活动持续一周 与会者停留的时间长短不一 而且床需要重复
  • Objective-C:在哪里定义宏以便随处可用?

    我有一个 iOS 应用程序 它在许多视图控制器中使用相同的字符串 数字等 所以我认为最好在一个文件中定义这些常量并在所有视图控制器实现中使用它 优点是更改一个数字 我只需要做一次 而不是在所有视图控制器中都使用该数字 实际上 我的 h 文件

随机推荐