【问题标题】:Prolog Arguments are not sufficiently instantiatedProlog 参数没有充分实例化
【发布时间】:2010-01-11 20:19:59
【问题描述】:

我正在尝试匹配我正在创建的事实的子集,并且我的测试用例运行良好!

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),子集(X,Z)。 剩余(X,Y,D,M):- x(Z,D),选择(X,Z,N),选择(Y,N,M)。 对(X,Y,R):- x([X,Y],R); x([Y,X],R)。 输出: ?- x([1,2|REST],D)。 休息 = [3, 4], D = 呜呜 休息 = [4], D = bleah2 ; 休息 = [], D = bleah8 ; 错误的。 ?- 对(2,1,D)。 D = bleah8 ; 错误的。 ?- 模糊([2,1],R)。 R = 呜呜 R = bleah2 ; R = bleah8 ; 错误的。 ?- 剩余(2,1,D,M)。 D = 呜呜, M = [3, 4] ; D = bleah2, M = [4] ; D = bleah8, M = []; 错误的。

然后我添加了一个事实来代表我的下一个潜在案例,现在它已经完全崩溃了。我是 Prolog 的新手,我不确定这是为什么或如何解决它。

x([6,X,8,9],'woot') :- (X+0) > 7。 输出: ?- x([1,2|REST],D)。 休息 = [3, 4], D = 呜呜 休息 = [4], D = bleah2 ; 休息 = [], D = bleah8 ; 错误的。 ?- 对(2,1,D)。 D = bleah8 ; 错误的。 ?- 模糊([2,1],R)。 R = 呜呜 R = bleah2 ; R = bleah8 ; 错误:> / 2:参数没有充分实例化 ^ 例外: (9) _G260+0>7 ?中止 % 执行中止 ?- 剩余(2,1,D,M)。 D = 呜呜, M = [3, 4] ; D = bleah2, M = [4] ; D = bleah8, M = []; 错误:> / 2:参数没有充分实例化 ^ 例外:(10) _G270+0>7 ?中止 % 执行中止 ?- x([_,15,_,_],D)。 D = 羊毛。

欢迎提出建议。

【问题讨论】:

    标签: prolog instantiation-error


    【解决方案1】:

    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))。我在测试这个概念时使用数字作为占位符。我将尝试使用另一种数据类型,因为我的枚举应该限制选择列表。
    【解决方案2】:

    fuzzy/2remaining/4 中,您调用x/2 时带有未实例化的Z。这意味着+(因此>)的左侧没有实例化。

    【讨论】:

    • 不幸的是,我认为这可能会使这种搜索我的事实的方法无效。您会建议任何解决方法,还是我必须重新评估我的模型?
    【解决方案3】:

    好的,更改为有限数据类型有帮助!

    % 基本比较 相同(X,Y):- X == Y。 大于(X,Y):-小于(Y,X)。 小于(X,Y):- is_lessThan(X,Y)。 小于(X,Y):- is_lessThan(X,Z),小于(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), lessThan(Y,'i')。 % 在 X & Y 中分别指定两个列表项 模糊匹配(X,Y,R):- x([X,Y],R); x([Y,X],R) 。 % 指定列表 X 模糊匹配(X,R):- x(Z,R),子集(X,Z)。 % 分别指定两个列表项,返回不匹配的剩余项 模糊匹配(X,Y,D,M):- x(Z,D),选择(X,Z,N),选择(Y,N,M)。 输出: ?- 模糊匹配('b','a',D)。 D = ab; 错误的。 ?-模糊匹配(['b','a'],D)。 D = abcd ; D = abd; D = ab; D = fXY ; D = fXY ; 错误的。 ?- 模糊匹配('b','a',R,D)。 R = abcd, D = [c, d] ; R = abd, D = [d] ; R = ab, D = []; R = fXY, D = [f] ; R = fXY, D = [f] ; 错误的。

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多