2

論理プログラミング(Prolog)の新機能。簡単な質問に出くわしますが、プロローグでそれをコーディングする方法がわかりません。

質問は、いくつかの引数があるようなものです:引数(a)、引数(b)...、および引数を意味するattack(a、b)のようないくつかの攻撃関係は引数bを攻撃します。それで、議論を与えられて、私はそれが根拠のあるものであるかどうかを知りたいです。引数aの「接地」は、bがaを攻撃する場合、別の引数が存在することを意味します。たとえば、cがbを攻撃します。引数がcを攻撃しない場合、aとcは接地されていると言います。

この目標を達成するために、このgrounded/1プログラムを実装する方法の例を挙げてください。

明確にするかどうかはわかりませんが、アドバイス(またはコード)を提供することを歓迎します!!

4

2 に答える 2

3

あなたの説明から私が理解したことは、それを攻撃する他の根拠のある議論がない場合、その議論は根拠があるということです。

grounded/1プロローグでは、このルールに従うプロシージャを簡単に定義できます。

grounded(A):-
  argument(A),    % A is an argument
  \+              % for which there does not exist
  (
    attack(B, A), % an attacker
    grounded(B)   % which is grounded
  ).

[OPによるコメント後に編集]: サイクルに対処する必要がある場合は、おそらく、訪問した「攻撃」のリストを保持する必要があります。サイクルを禁止する必要はありません:

grounded(A):-
  grounded(A, []).


grounded(A, L):-
  argument(A),
  \+
  (
    attack(B, A),
    \+ member(B, L),  % Here we forbid cycles
    grounded(B, [A|L])  % We add the current argument to the list of forbidden arguments
  ).
于 2013-02-08T14:25:23.383 に答える