假设我想要有许多都遵循相同模式的规则。当我想通过明确列出所有可能的第一个参数来避免非确定性行为时,我遇到了这种情况。然而,我知道,对于某些可能性,我需要做同样的事情。处理它的一种方法是在最后有一个包罗万象的条款:
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 (在最底部)