标签: prolog-defaulty

术语列表的术语扩展

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

foo(a) :- /* do something */.
foo(b) :- /* do something else*/.
foo(_). /* ignore the rest */
Run Code Online (Sandbox Code Playgroud)

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

foo(X) :- memberchk(X, [ /* list of possible values of X */ ]).
Run Code Online (Sandbox Code Playgroud)

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

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

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

expand_foo(Foo, foo(Foo)).
other_foos([x,y,z]).
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

macros metaprogramming prolog prolog-defaulty

5
推荐指数
1
解决办法
326
查看次数

prolog 捕获仅在没有其他子句时才处于活动状态的所有子句

我有一个谓词将模态逻辑公式与其负范式联系起来。除模态运算符、合取和析取之外的所有连接词都被消除,并且否定被尽可能地推入表达式的叶子中。

\n\n

\xe2\x9c\xb1谓词rewrite/2有一个包罗万象的子句rewrite(A, A).,该子句在文本上是最后一个。有了这个包罗万象的子句,就可以提取否定范式的公式。在此示例中,e是双条件连接词,如 \xc5\x81ukasiewicz 表示法,并且47是模态逻辑中的变量(因此也是 Prolog 常量)。

\n\n

Z与负范式公式统一。

\n\n
?- rewrite(e(4, 7), Z).\nZ = a(k(4, 7), k(n(4), n(7)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,rewrite(<some constant>, <some constant>)总是成功,我希望它不要成功。包罗万象的子句确实应该是一个包罗万象的子句,而不是如果另一个子句适用则可能会触发的东西。

\n\n
?- rewrite(e(4, 7), e(4, 7)).\ntrue.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试rewrite(A, A).用受保护的版本替换:

\n\n
wff_shallowly(WFF) :-\n  WFF = l(_);\n  WFF = m(_);\n  WFF = c(_, _);\n  WFF = f;\n  WFF = t;\n  WFF = k(_, _);\n  WFF = a(_, _);\n  WFF = …
Run Code Online (Sandbox Code Playgroud)

prolog modal-logic prolog-defaulty

5
推荐指数
1
解决办法
159
查看次数