C言語で私は次のようなものを持っています:
if(cond1)
{}
else if(cond2)
{}
else
{}
これはPrologでどのように可能ですか?
( If1 -> Then1
; If2 -> Then2
; ...
; otherwise
).
if-then-else が必要になるのは、さまざまな句でパターン マッチングによってさまざまな条件を表現できない場合のみです。パターン マッチングで表現できるものはすべて、パターン マッチングで表現する必要があります。これは通常、より一般的で効率的なコードにつながるからです。
(cond1 ->
consequent1
; cond2 ->
consequent2
;
alternative
)
記録のために、これは条件と呼ばれます。
->/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.
さよなら
(@mat で指摘されているように) Prolog には慣用的な代替手段があるため、見つけるのは簡単ではありません。こちらの SWI-Prolog のドキュメントを参照してください。簡潔すぎますが、正確です。関連する点を引用します。
(If -> Then) は (If -> Then ; fail) のように機能し、条件が失敗すると構成が失敗することに注意してください。この異常なセマンティクスは、ISO および事実上のすべての Prolog 標準の一部です。