假设我想要一些遵循相同模式的规则。当我想要避免非确定性行为并显式列出所有可能的第一个参数时,我会遇到这种情况。但是,我知道对于某些可能性,我需要完全相同的操作。处理这种情况的一种方法是在最后添加一个通配符子句:
foo(a) :- /* do something */.
foo(b) :- /* do something else*/.
foo(_). /* ignore the rest */
但这并不是很好,因为我无法知道是否收到了意外的输入,还是我在程序中犯了错误。为了避免这种情况,我也可以这样说。
foo(X) :- memberchk(X, [ /* list of possible values of X */ ]).
但是,我现在正在与Prolog的确定性行为和索引抗争,尤其是当参数是ground时。
因此,我会采取以下方式:
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(在最底部)。