Dem*_*nex 5 prolog instantiation-error
我正在尝试匹配我正在创建的事实的一部分,我的测试用例工作得很好!
x([1,2,3,4],'bleah'). x([1,2,4],'bleah2'). x([1,2],'bleah8'). x([1,3,4],'bleah3'). x([5,6,7,8],'bleah5'). x([6,7,8,9],'bleah6'). fuzzy(X,R) :- x(Z, R), subset(X,Z) . remaining(X,Y,D,M) :- x(Z,D) , select(X,Z,N), select(Y,N,M). pair(X,Y,R) :- x([X,Y],R) ; x([Y,X],R). Output: ?- x([1,2|REST],D). REST = [3, 4], D = bleah ; REST = [4], D = bleah2 ; REST = [], D = bleah8 ; false. ?- pair(2,1,D). D = bleah8 ; false. ?- fuzzy([2,1],R). R = bleah ; R = bleah2 ; R = bleah8 ; false. ?- remaining(2,1,D,M). D = bleah, M = [3, 4] ; D = bleah2, M = [4] ; D = bleah8, M = [] ; false.
然后我添加了一个事实来代表我的下一个潜在案例,现在它已经完全破碎了.我是Prolog的新手,我不知道为什么会这样或如何解决它.
x([6,X,8,9],'woot') :- (X+0) > 7. Output: ?- x([1,2|REST],D). REST = [3, 4], D = bleah ; REST = [4], D = bleah2 ; REST = [], D = bleah8 ; false. ?- pair(2,1,D). D = bleah8 ; false. ?- fuzzy([2,1],R). R = bleah ; R = bleah2 ; R = bleah8 ; ERROR: >/2: Arguments are not sufficiently instantiated ^ Exception: (9) _G260+0>7 ? abort % Execution Aborted ?- remaining(2,1,D,M). D = bleah, M = [3, 4] ; D = bleah2, M = [4] ; D = bleah8, M = [] ; ERROR: >/2: Arguments are not sufficiently instantiated ^ Exception: (10) _G270+0>7 ? abort % Execution Aborted ?- x([_,15,_,_],D). D = woot.
建议欢迎.
好的,更改为有限数据类型有帮助!
% 基本比较
相同(X,Y):- X == Y。
大于(X,Y):-小于(Y,X)。
lessThan(X,Y) :- is_lessThan(X,Y)。
lessThan(X,Y) :- is_lessThan(X,Z) 、 lessThan(Z,Y)。
% 枚举一个列表
is_lessThan( 'a', 'b' ).
is_lessThan( 'b', 'c' ).
is_lessThan( 'c', 'd' ).
is_lessThan( 'd', 'e' ).
is_lessThan( 'e', 'f' ).
is_lessThan( 'f', 'g' ).
is_lessThan( 'g', 'h' ).
is_lessThan( 'h', 'i' ).
% 可变长度的“静态”事实
x(['a','b','c','d'],'abcd').
x(['a','b','d'],'abd').
x(['a','b'],'ab').
x(['a','c','d'],'acd').
x(['e','f','g','h'],'efgh').
x(['f','g','h','i'],'fghi').
% 可变长度和约束的“动态”事实
x(['f',X,'h','i'],'fXhi') :- 大于('g',X)。
x(['f',X,Y],'fXY') :- 大于('g',X), 小于(Y,'i')。
% 分别指定 X & Y 中的两个列表项
fuzzyMatch(X,Y,R) :- x([X,Y],R) ; x([Y,X],R) 。
%指定列表X
fuzzyMatch(X,R) :- x(Z, R), 子集(X,Z) 。
% 分别指定两个列表项,返回不匹配的剩余项
fuzzyMatch(X,Y,D,M) :- x(Z,D) ,选择(X,Z,N),选择(Y,N,M)。
输出:
?- fuzzyMatch('b','a',D)。
D = ab;
错误的。
?- fuzzyMatch(['b','a'],D)。
D = abcd;
D = abd;
D = ab;
D = fXY;
D = fXY;
错误的。
?- fuzzyMatch('b','a',R,D)。
R = abcd,
D = [c, d] ;
R = abd,
D = [d];
R = ab,
D = [];
R = fXY,
D = [f];
R = fXY,
D = [f];
错误的。