使用 var(X) 的 Prolog 二叉树
Prolog binary tree using var(X)
我构建了二叉树结构,binarytree(Data,LeftSub,RightSub)。
istree(nil).
istree(binarytree(_,L,R)) :- istree(L), istree(R).
但是,我想用未实例化的变量而不是 istree(nil) 来表示空树,使用内置谓词 var(X)。
istree(D) :- var(D).
istree(binarytree(D,_,_)) :- var(D).
istree(binarytree(D,L,R)) :- not(var(D)).
istree(binarytree(D,L,R)) :- not(var(D)), istree(L), istree(R).
我试过了,好像不太对。
同时断言一组子句的真假可能会出现问题。我认为你可以只陈述正面案例,否则让 Prolog 失败:
istree(T) :-
nonvar(T),
T = t(_,L,R),
(var(L) ; istree(L)),
(var(R) ; istree(R)).
我缩短了仿函数,以简化测试
8 ?- istree(t(a,_,_)).
true
.
9 ?- istree(t(a,t(b,_,_),_)).
true
.
10 ?- istree(t(a,t(b,_,_),t(c,_,_))).
true
.
我构建了二叉树结构,binarytree(Data,LeftSub,RightSub)。
istree(nil).
istree(binarytree(_,L,R)) :- istree(L), istree(R).
但是,我想用未实例化的变量而不是 istree(nil) 来表示空树,使用内置谓词 var(X)。
istree(D) :- var(D).
istree(binarytree(D,_,_)) :- var(D).
istree(binarytree(D,L,R)) :- not(var(D)).
istree(binarytree(D,L,R)) :- not(var(D)), istree(L), istree(R).
我试过了,好像不太对。
同时断言一组子句的真假可能会出现问题。我认为你可以只陈述正面案例,否则让 Prolog 失败:
istree(T) :-
nonvar(T),
T = t(_,L,R),
(var(L) ; istree(L)),
(var(R) ; istree(R)).
我缩短了仿函数,以简化测试
8 ?- istree(t(a,_,_)).
true
.
9 ?- istree(t(a,t(b,_,_),_)).
true
.
10 ?- istree(t(a,t(b,_,_),t(c,_,_))).
true
.