我想知道prolog列表

时间:2013-10-09 16:55:29

标签: prolog

我想知道是否有办法在prolog中“快捷”列表声明。代替 [1,2,3]。我想myList = [1,2,3]。这样我可以尝试使用myList(例如成员(X,myList),而不是在我需要的每个地方重复实际列表。这可能吗?事实上我没有在谷歌上找到任何东西然而告诉我它可能不是,但你永远不会知道。谢谢你。

3 个答案:

答案 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 */