1

私が何を意味するのかを明確にするために、この繰り返しの例を見てみましょう:

statement([]). 
statement([A|B]):- A, statement(B).

ヘッドAは私のルールによってチェックされ、テールBは再帰的に送信され、レベル2のヘッドになります。それが再帰して2番目のレベルにある場合、前のAにアクセスするにはどうすればよいですか。私はそれをすべて間違って考えていますか?説明が必要な場合は、お問い合わせください。そうさせていただきます。前もって感謝します。

私がテストしていると思われるもの(タイプチェッカー):

String s; int i; i = s.length(); // OK

また

String s; int i; s = i.length(); // fails
4

2 に答える 2

2

各反復で前のステップにアクセスできるように、前のステートメントを明示的に記録する必要があります。これらのステートメントをどのように記録するかはあなた次第です。1つの解決策は次のとおりです。

statement(L) :- statement(L,[]).
statement([], _). 
statement([A|B], L):- check(A), statement(B,[A|L]).

Lは、先行するステートメントを(逆の順序で)記録します。

于 2012-05-01T06:14:33.137 に答える
0

確かに..プロローグデータベースを使用し、アサートして撤回します。これはそれを示しています:

% Declare the lasthead fact as dynamic, so facts can change
:-dynamic lasthead/1.

% Set a starting value for the first iteration
lasthead(null).

statement([]).
statement([A|B]) :-

    % Show the previous head
    lasthead(LH),
    writeln(['Last head was', LH]),

    % Retract last head. ie. remove from the database
    retract(lasthead(_)),

    % Store the current head in the database
    assertz(lasthead(A)),

    % Recurse around
    statement(B).


?- statement([a,b,c,d,e]).
[Last head was,null]
[Last head was,a]
[Last head was,b]
[Last head was,c]
[Last head was,d]

上記の例では、lasthead(X) ファクトが 1 つだけであることを保証するためにrettract を使用していますが、retract を削除すると、リスト アイテムごとに 1 つずつ、複数の lasthead(X) ファクトを持つことが保証されます。

次に、たとえばを使用して、複数の lasthead(X) ファクトにアクセス/処理できます。findall(X, lasthead(X), Y) を使用すると、途中でアサートした lasthead(X) 値が得られます。

于 2012-05-01T09:55:45.623 に答える