5

C言語で私は次のようなものを持っています:

if(cond1)
{}
else if(cond2)
{}
else
{}

これはPrologでどのように可能ですか?

4

5 に答える 5

9
(   If1 -> Then1
;   If2 -> Then2
;   ...
;   otherwise
).

if-then-else が必要になるのは、さまざまな句でパターン マッチングによってさまざまな条件を表現できない場合のみです。パターン マッチングで表現できるものはすべて、パターン マッチングで表現する必要があります。これは通常、より一般的で効率的なコードにつながるからです。

于 2012-04-12T11:42:01.460 に答える
7
(cond1 ->
    consequent1
; cond2 ->
    consequent2
;
    alternative
)

記録のために、これは条件と呼ばれます。

于 2012-04-12T11:40:21.253 に答える
2

->/2 は、特定の決定論を課したい場合にのみ必要です。ローカル カットのように機能します。ただし、コードで非決定性を維持したい場合は、->/2 を使用する必要はありません。

次の命令コードを使用します。

boolean listOfBool(Object obj) {
   if (obj instanceof ConsCell) {
       if (((ConsCell)ob).head() instanceof Boolean) {
           return listOfBool(((ConsCell)ob).tail());
       } else {
           return false;
       }
  } else if (obj == null) {
       return true;
  } else {
       return false;
  }

}

これは、次のように ->/2 なしで Prolog でコーディングできます。

% bool(+Bool)
% bool(-Bool)
bool(0).
bool(1).

% list_of_bool(+List)
% list_of_bool(-List)
list_of_bool(L) :-
    (L = [X|Y], bool(X), list_of_bool(Y);
     L = []).

利点は、ブール値のリストをチェックし、ブール値のリストを生成するために使用できることです:

?- list_of_bool([0,1,0]).
Yes 
?- list_of_bool([0,1,2]).
No
?- List=[_,_,_], list_of_bool(List).
List = [0, 0, 0] ;
List = [0, 0, 1] ;
List = [0, 1, 0] ;
List = [0, 1, 1] Etc..

一般に、論理和 (;)/2 は複数の句に分散できます。これを unification (=)/2 を head に移動することと組み合わせると、通常、述語が索引付けにより適しているため、ある程度の速度が得られます。

(;)/2 と (=)/2 を削除した list_of_bool の別の定式化は次のようになります。

% list_of_bool2(+List)
% list_of_bool2(-List)
list_of_bool2([X|Y]) :- bool(X), list_of_bool2(Y).
list_of_bool2([]).

上記はまったく同じように機能します (最初のクエリでは選択ポイントが残っていないため、(->)/2 なしでは通常 (;)/2 が検出しないため、実際にはより適切に機能します):

?- list_of_bool2([0,1,0]).
Yes
?- list_of_bool2([0,1,2]).
No
?- List=[_,_,_], list_of_bool(List).
List = [0, 0, 0] ;
List = [0, 0, 1] ;
List = [0, 1, 0] ;
List = [0, 1, 1] Etc..

これは、Prolog を開始する方法でもあります。ルールのみあり、選言 (;)/2 なし、統一 (=)/2 なし。後の 2 つは、基礎となる Horn 句に既に含まれています。

(;)/2 も (=)/2 もなしの Prolog があり、透明な (;)/2 をカットする必要がない場合、次のようにこれらの構成を自分で定義できます。

X = X.

(A ; _) :- A.
(_ ; B) :- B.

さよなら

ホーン条項
http://en.wikipedia.org/wiki/Horn_clause

于 2012-04-12T19:51:00.083 に答える
1

(@mat で指摘されているように) Prolog には慣用的な代替手段があるため、見つけるのは簡単ではありません。こちらの SWI-Prolog のドキュメントを参照してください。簡潔すぎますが、正確です。関連する点を引用します。

(If -> Then) は (If -> Then ; fail) のように機能し、条件が失敗すると構成が失敗することに注意してください。この異常なセマンティクスは、ISO および事実上のすべての Prolog 標準の一部です。

于 2012-04-12T12:58:42.617 に答える