1

2 ビット全加算器回路を検証するために使用する関数と述語が与えられました。これは私がこれまでに理解したことです:-

関数 signal(t) ここで、t は端末であり、signal は値 1 または 0 を取ります。

signal(T, V) :- V is 1; V is 0.

type が回路要素であり、type(x) が値 xor、および、またはを取ることができる関数 type(x)

type(X, T) :- T is and; T is or; T is xor.

関数 out(x) はゲート x での出力を表し、in(n, x) n は入力端子です。

out(X, O) :- type(X, and), O is I1+I2, in(1, X, I1), in(1, X, I2). 
%%and so on for other gates

ゲートの述語は次のように与えられます

forall X[{type(X) == OR} ----> {(out(X) =1)}-----> for some y(in(y, X) = 1)]

これらについては、それらをプロローグ コードに変換する方法がわかりません。また、プロローグ関数が何かを返す方法もわかりません (結果もパラメーターとして提供する必要があると思います)。

どんなヘルプもとても役に立ちます!

4

1 に答える 1

1

まず、問題のより適切な表現を選択する必要があります。このネズミイルカには事実だけで十分です。回路は次のように表すことができます。

in/1 --> 入力信号 (0 または 1)。これは、無限ループを避けるために必要です (後述)。

xor/2、and/2、or/2 -->回路A と B に対する論理演算。not/1 --> など

このようにして、回路は次の形になります。

xor(and(in(In1),in(In2)),or(in(In1),not(in(In3))))

ここで、回路の状態を計算する述語 output/1 を定義しましょう。

output(xor(In1,In2),1) :-
    output(In1,Out1),
    output(In2,Out2),
    Out1 \== Out2.
output(xor(In1,In2),0) :-
    output(In1,Out1),
    output(In2,Out2),
    Out1 == Out2.

output(and(In1,In2),1) :-
    output(In1,1),
    output(In2,1).
output(and(In1,In2),0) :-
    output(In1,Out1),
    output(In2,Out2),
    (Out1==0 ; Out2==0).

output(or(In1,In2),1) :-
    (output(In1,1); output(In2,1)).
output(or(In1,In2,0),0) :-
    output(In1,0),
    output(In2,0).

output(not(In),0) :-
    output(In,1).
output(not(In),1) :-
    output(In,0).
output(in(0),0).
output(in(1),1).

このプレデシエーションはポルポウスで可逆であるため、すべての出力を取得するために、入力を自由変数として残すことができます。

?- output(xor(and(in(In1),in(In2)),or(in(In1),not(in(In3)))),Result).
In1 = In2, In2 = In3, In3 = 0,
Result = 1 ;
In1 = In2, In2 = In3, In3 = 0,
Result = 1 ;
In1 = In3, In3 = 0,
In2 = Result, Result = 1 ;
In1 = Result, Result = 1,
In2 = 0 ;
In1 = Result, Result = 1,
In2 = In3, In3 = 0 ;
In1 = In2, In2 = 1,
Result = 0 ;
In1 = In2, In2 = 1,
In3 = Result, Result = 0 ;
false.

output(A,B)と混同しないでくださいoutput(in(A),B)。1 つ目は任意の回路 (無限ループ) にインスタンス化でき、2 つ目は 0 または 1 にインスタンス化できます。

再帰回路で動作するようです:

?- output(or(in(Input),in(InOut)),InOut).
Input = InOut, InOut = 1 ;
InOut = 1.
于 2016-09-20T08:23:37.757 に答える