最近の質問「プロローグ二分探索木テスト - 不要な親の親ノード比較」に対する以前の回答で、プロローグ コルーチンを使用するミキシングを提案しました...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))。
... dcg 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/3
in_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]。 偽。
それを回避し、 list-differencelazy_chain
の一部に制限するにはどうすればよいですか?