1

プロローグでリスト宣言を「ショートカット」する方法があるかどうか疑問に思っています。[1,2,3] の代わりに。myList = [1,2,3] にしたいと思います。そうすれば、必要なすべての場所で実際のリストを何度も繰り返す必要なく、myList (member(X, myList) など) を使用することができます。これは可能ですか? Google で何も見つからなかったという事実おそらくそうではないと言われていますが、決してわかりません. ありがとう.

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 に答える
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 に答える