1

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

4

3 回答 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 回答