【问题标题】:Prolog - Arguments are not sufficiently instantiated. Recursion depthProlog - 参数没有充分实例化。递归深度
【发布时间】:2017-12-10 00:37:23
【问题描述】:

我是 prolog 的新手,想限制递归深度,但它不断抛出“参数没有充分实例化”错误。我会将问题概括为图表。

edge(a,b).
edge(a,x).
edge(b,c).
edge(b,x).
edge(c,d).

所以,有一条从 a 到 d 的路径:a-b-c-d 检查两个顶点之间是否存在路径非常容易:

path(X,Y) :- edge(X,Y).
path(X,Y) :- edge(X,Z), path(Z,Y).

现在我想限制路径的长度为 N:

limitedPath(X,Y,N) :- edge(X,Y), N >= 0.
limitedPath(X,Y,N) :- edge(X,Z),limitedPath(Z,Y,M), N = M + 1, N>0.

limitedPath(a,b,2) 为真, 但是 limitedPath(a,c,1) 抛出“参数没有充分实例化”,我无法理解原因。

【问题讨论】:

  • 查看this 了解一般方法。即:closure(edge, A, B)
  • M 未在递归调用中实例化。如果N 应该是一个限制,那么在调用之前减去一个更有意义。
  • 啊,一个教程把我弄糊涂了。
  • N = M + 1 不会按照你的想法做(除非你使用一些时髦的 Prolog 版本,比如 Visual、PDC 或 Turbo Prolog)。它试图将N 中的术语与+(M, 1) 术语统一起来。它不会评估 M + 1 并与 N 进行比较。你可能想要N is M + 1。或者,正如@false 在他的回答中所说,使用 CLP(FD),这是在 Prolog 中使用整数进行推理的首选方法。
  • 是的,我明白了。谢谢。

标签: recursion prolog instantiation-error


【解决方案1】:

继续你的想法:

:- use_module(library(clpfd)).

limitedPath(X,Y,N) :- N #>= 0, edge(X,Y).
limitedPath(X,Y,N) :- N #>= 0, N #= M+1, edge(X,Z), limitedPath(Z,Y,M).

【讨论】:

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