Prolog参数未充分实例化。

5
我试图匹配我创建的事实的子集,我的测试用例非常好!
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')。
模糊(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)。
输出: ?- 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。
输出: ?- 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.
欢迎提出建议。
3个回答

3
X只能是自然数吗?如果是,那么你可以修改你的规则。
x([6,X,8,9], 'woot') :- (X+0) > 7.

为了

x([6, X, 8, 9], 'woot') :- between(8, inf, X).

这至少在SWI-Prolog中可行:

?- x(A, B).
A = [6, 8, 8, 9],
B = woot ;
A = [6, 9, 8, 9],
B = woot ;
A = [6, 10, 8, 9],
B = woot ;
...

最终它将是针对我列举的一系列事实的测试(例如:less(a,b),less(b,c) -> less(a,c))。在测试概念时,我使用数字作为占位符。我将尝试使用另一种数据类型进行测试,因为我的枚举应该限制选择列表。 - Demosthenex

2
fuzzy/2remaining/4 中,您正在使用未实例化的 Z 调用 x/2。这意味着 + 的左侧(因此也是 >)未实例化。请注意保留 HTML 标记。

不幸的是,我认为这可能会使我的事实搜索方法无效。你有什么解决办法建议吗?还是我需要重新评估我的模型? - Demosthenex

1
好的,改成有限数据类型确实有帮助!
% 基本比较 same(X,Y) :- X == Y. greaterThan(X,Y) :- lessThan(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') :- greaterThan('g',X). x(['f',X,Y],'fXY') :- greaterThan('g',X), lessThan(Y,'i').
% 在X和Y中分别指定两个列表项 fuzzyMatch(X,Y,R) :- x([X,Y],R) ; x([Y,X],R) .
% 指定列表X fuzzyMatch(X,R) :- x(Z, R), subset(X,Z) .
% 分别指定两个列表项,返回未匹配的剩余项 fuzzyMatch(X,Y,D,M) :- x(Z,D) , select(X,Z,N), select(Y,N,M).
输出:
?- fuzzyMatch('b','a',D). D = ab ; false.
?- fuzzyMatch(['b','a'],D). D = abcd ; D = abd ; D = ab ; D = fXY ; D = fXY ; false.
?- 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] ; false.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接