我想知道是否有一种方法可以“捷径”prolog 中的列表声明。而不是 [1,2,3]。我想要 myList = [1,2,3]。这样我就可以尝试使用 myList (例如 member(X, myList) 而不必在我需要的每个地方一遍又一遍地重复实际列表。这可能吗?事实上我在谷歌上没有找到任何东西但告诉我可能不是,但你永远不知道。谢谢。
问问题
67 次
3 回答
2
在一个子句中,只需使用一个变量(即以大写开头的符号)统一列出文字
some_rule(Z) :-
X = [1,2,3], Y = [4,5,6],
append(X, Y, Z),
forall(member(M, X), writeln(M)).
否则,要在多个子句之间共享列表,请使用 dasblinkelight 的提示。
于 2013-10-09T17:06:00.330 回答
2
您可以使用常规 Prolog“事实”来代替此类声明,如下所示:
myList([1, 2, 3]).
现在你可以在你的程序中使用这个事实,像这样:
someRule :-
myList(L), /* Unify L with the list from myList fact */
member(X, L), /* Use L, which is now the [1, 2, 3] list */
...
这种方法使您可以避免需要在程序中的多个位置使用的硬编码列表。
于 2013-10-09T17:00:38.610 回答
0
如果有人需要一个示例,这是我用来测试它的代码,它可以工作。
:- dynamic my_spell_is/1.
my_spell_is(none).
spellslist([fire,ice,lightning,heal]).
casting :-
my_spell_is(X),
write('Current spell: '), write(X), nl.
isspell(X) :- (validSpell(X) ->
my_spell_is(Y),
retract(my_spell_is(Y)),
assert(my_spell_is(X)) ;
write(X), write(' is not a valid spell.'), nl).
validSpell(X) :-
spellslist(L), /* Unify L with the list from spellslist fact */
member(X, L). /* Use L, which is now the [fire,ice,lightning,heal] list */
于 2013-10-09T17:16:41.547 回答