3

最近の質問「プロローグ二分探索木テスト - 不要な親の親ノード比較」に対する以前の回答で、を使用するミキシングを提案しました...lazy_chain/2

:- use_module (ライブラリ(clpfd) )。

lazy_chain(Zs, R_2) :-
   (   var (R_2) -> instanceiation_error (R_2)
   ; clpfd:chain_relation(R_2) ->フリーズ(Zs, lazy_chain_aux(Zs,R_2))
   ;  それ以外の場合                 -> domain_error (chain_relation、R_2)
   )。

lazy_chain_aux([], _)。
lazy_chain_aux([Z0|Zs], R_2) :-
   フリーズ (Zs, lazy_chain_aux_(Zs,R_2,Z0))。

lazy_chain_aux_([], _, _)。
lazy_chain_aux_([Z1|Zs], R_2, Z0) :-
   呼び出し(R_2、Z0、Z1)、
   フリーズ (Zs, lazy_chain_aux_(Zs,R_2,Z1))。

... in_order//1と一緒に...

in_order(nil) --> [].
in_order(node(X,L,R)) --> in_order(L), [X], in_order(R).

... そのようです:

?- lazy_chain(Zs, #<),
   フレーズ(in_order(node(1,nil,nil)), Zs).
Zs = [1,23]。

その範囲が で記述されたシーケンスの一部に限定されるように「プッシュ」する簡単な方法はありlazy_chainますか?phrase/3in_order//1

今、私は...

?- lazy_chain(Zs, #<),
   フレーズ(in_order(node(1,nil,nil)), Zs0,Zs).
Zs0 = [1|Zs]、freeze(Zs, lazy_chain_aux(Zs,#<))。

...これは(もちろん)さらにインスタンス化すると失敗する可能性がありますZs

?- lazy_chain(Zs, #<),
   フレーズ(in_order(ノード(1、nil、nil))、Zs0、Zs)、
   Zs = [3,2,1]。

それを回避し、 lazy_chainの一部に制限するにはどうすればよいですか?

4

2 に答える 2

0

コルーティングと DCG を混在させても問題はないと思います。DCG は、DCG ルールからH --> B通常の Prolog ルールへの変換にすぎませんH' :- B'。制約の投稿は、 にラップできます{}/1

Quinesの例を次に示します。

% eval(+Term, +List, -Term, +Integer)
eval([quote,X], _, X) --> [].
eval([cons,X,Y], E, [A|B]) -->
   step,
   eval(X, E, A),
   eval(Y, E, B).
eval([lambda,X,B], E, [closure,X,B,E]) --> [].
eval([X,Y], E, R) -->
   step,
   {neq(X, quote), sto(B)},
   eval(X, E, [closure,Z,B,F]),
   {sto(A)},
   eval(Y, E, A),
   eval(B, [Z-A|F], R).
eval(S, E, R) -->
   {freeze(S, is_symbol(S)), freeze(E, lookup(S, E, R))}.

に対しても同じことができますlazy_chain_upto//2。まず、次のように最初の句を定義しlazy_chain_upto//2 ます。

lazy_chain_upto(R_2, P_2) -->
   (  {var(R_2)}                  -> {instantiation_error(R_2)}
   ;  {clpfd:chain_relation(R_2)} -> /* ?? */
   ;  {otherwise}                 -> {domain_error(chain_relation, R_2)}
   )

その/* ?? */部分では、DCG 化されたlazy_chain_upto_aux//1述語からも利益を得ることができます。もちろん、DCG 変換が (->) と (;)/2 を理解すると仮定しています。

さよなら

于 2016-02-28T20:26:42.390 に答える