1

私は Prolog でコードを書く最初の段階にあり、まだパラダイムに頭を悩ませているので、この質問の原始性を許してください。

ウィキペディアで読んだ

A rule is of the form
Head :- Body.
and is read as "Head is true if Body is true".

それはとても簡単です。そこで、1 ビット加算器の機能をシミュレートするナレッジ ベースを構築しています。

そうすることで、次のルールを作成しようとしています。

ゲート X が存在し、X が AND ゲートであり、X から出力される端子があり、その端子に信号があり、信号が 0 である場合、ゲート X には、信号を持つ少なくとも 1 つの入力端子も必要です。 0の。

プロローグのルールとして、上記の文を反映するためにこれを書きました。

gate(X) /\ gate_type(X, and) /\ terminal(T, X, out) /\ signal(T, SIG) /\ (SIG is 0) :- (gate(X) /\ gate_type(X, and) /\ terminal_type(R, X, in) /\ signal(R, 0)).

私のルールをテストするためt7に、AND ゲートの端子である端子がありました。

terminal_type(t7, a1, in).
gate_type(a1, and).

Prolog:signal(t7, 1), signal(t8, 1), signal(t9, X).とか聞くとPrologさんが教えてくれます

X = 1;
X = 0;

私が得る答えは、X = 1 だけです。

4

1 に答える 1

2

Prologプログラミングへようこそ!あなたがハードウェアからそれを実現しようとしているのは非常に素晴らしいことです。

2 つの問題があると思います。

1 つ目は、定義が AND ゲートの定義特性を除外していることです。つまり、両方の入力が 1 の場合、出力は 1 になります。Prolog への変換は少し奇妙に見えますが、これを考慮に入れる必要があります。したがって、Prologであなたが言おうとしているのはこれだと思います:

signal(R, 0) :- 
  gate(X), gate_type(X, and), 
  terminal_type(R, X, out),
  terminal_type(R1, X, in), signal(R1, 0).

ただし、これがすべてではありません。これも必要です:

signal(R, 1) :- 
  gate(X), gate_type(X, and), 
  terminal_type(R, X, out),
  terminal_type(R1, X, in), terminal_type(R2, X, in), R1 \= R2,
  signal(R1, 1), signal(R2, 1).

これは正しいかもしれませんが、2 つ目の問題は、signal(t7, 1)これはアサーションではないため、ファクト データベースに反映されないことです。これは単純な構造であるため、クエリに何も追加しません。最も簡単な解決策は、データベースに直接追加することです。

signal(t7, 1).
signal(t8, 1).

次に、クエリを実行します。

signal(t9, X).

または、次のことができassertz/1ます。

assertz(signal(t7, 1)), assertz(signal(t8, 1)), signal(t9, X).

しかし、assertバックトラックで取り消されない副作用であるため、それはちょっとずさんです。

実際には、ほとんどの場合、何かを渡すことによって動的クエリの一部にするか、ファクト データベースの一部にします。2つを混在させると、推論が難しくなります。

私があなたなら、さまざまなファクト「タイプ」の数を次のように減らすことで、物事を単純化するでしょう。

% gate(Name, Type, Input1, Input2, Output)
gate(a1, and, t7, t8, t9).

次に、述語をかなり単純化できます。

signal(Out, 0) :-
  gate(_, and, R1, R2, Out),
  ( signal(R1, 0) ; signal(R2, 0)).
signal(Out, 1) :-
  gate(_, and, R1, R2, Out),
  signal(R1, 1),
  signal(R2, 1).
于 2013-03-11T21:27:38.943 に答える