我想知道是否有办法在prolog中“快捷”列表声明。代替 [1,2,3]。我想myList = [1,2,3]。这样我可以尝试使用myList(例如成员(X,myList),而不是在我需要的每个地方重复实际列表。这可能吗?事实上我没有在谷歌上找到任何东西然而告诉我它可能不是,但你永远不会知道。谢谢你。
答案 0 :(得分: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 */
...
这种方法可以避免需要在程序中的多个位置使用的硬编码列表。
答案 1 :(得分:2)
在一个子句中,只需使用变量(即以大写开头的符号)统一列出文字
some_rule(Z) :-
X = [1,2,3], Y = [4,5,6],
append(X, Y, Z),
forall(member(M, X), writeln(M)).
否则,要在多个子句中共享列表,请使用dasblinkelight'提示。
答案 2 :(得分: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 */