两者tree/1
和leaf/1
都是默认的1 ,2!为什么不使用像这样更清晰的表示?
is_tree(叶子(_))。
is_tree(bin(L,R)) :-
is_tree(L),
is_tree(R)。
注意:
的一些示例用途is_tree/1
:
?- is_tree(T)。% 产生
T = 叶(_A)
; T = bin(叶子(_A),叶子(_B))
; T = bin(叶子(_A),bin(叶子(_B),叶子(_C)))
; T = bin(叶子(_A),bin(叶子(_B),bin(叶子(_C),叶子(_D))))
...
?- is_tree(bin(leaf(1),bin(leaf(2),3)))。% 测试
错误的。
?- is_tree(bin(leaf(1),bin(leaf(2),leaf(3))))。% 测试
真的。
?- T = bin(bin(leaf(1),2),_), is_tree(T)。% 两者都做(或至少尝试)
错误的。
?- T = bin(bin(leaf(1),leaf(2)),_), is_tree(T)。% 两者都做
T = bin(bin(叶(1),叶(2)),叶(_A))
T = bin(bin(leaf(1),leaf(2)),bin(leaf(_A),leaf(_B)))
T = bin(bin(叶子(1),叶子(2)),bin(叶子(_A),bin(叶子(_B),叶子(_C))))
...
回到您关于如何实施elements/2
和content/2
...使用dcg的问题!
叶(叶(E))-> [E]。
叶子(bin(L,R))->叶子(L),叶子(R)。
相同内容(A,B):-
短语(叶子(A),Ls),
短语(叶子(B),Ls)。
示例查询:
?-same_content(bin(leaf(1),bin(leaf(2),leaf(3))),
仓(仓(叶(1),叶(2)),叶(3)))。
真的。
脚注 1:这篇关于 Prolog 教学的坚如磐石的论文讨论了许多常见的障碍,包括违约。
脚注 2:在这个答案中,@mat 解释了 Prolog 中的默认性如何阻碍声明性调试和推理。