在我之前对最近的问题“ Prolog二叉搜索树测试 - 不需要的父母的父节点比较”的回答中,我提出lazy_chain/2
了使用prolog-coroutineing的混合......
:- use_module ( library(clpfd) )。 懒惰链(Zs,R_2):- ( var (R_2) ->实例化_error (R_2) ; clpfd:chain_relation(R_2) ->冻结(Zs,lazy_chain_aux(Zs,R_2)) ; 否则 -> domain_error (chain_relation, R_2) )。 懒惰链辅助([],_)。 懒惰链辅助([Z0|Zs],R_2):- 冻结(Zs,lazy_chain_aux_(Zs,R_2,Z0))。 惰性链_辅助_([],_,_)。 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(节点(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],冻结(Zs,lazy_chain_aux(Zs,#<))。
...(当然)在进一步实例化时可能会失败Zs
:
?-lazy_chain(Zs, #<), 短语(in_order(节点(1,nil,nil)),Zs0,Zs), Zs = [3,2,1]。 假的。
我该如何解决这个问题并限制lazy_chain
到list-difference的一部分?