prolog - 序言中的深度有限搜索( Vanilla 元解释器)

标签 prolog metaprogramming

我需要修改 Vanilla 元解释器,以便进行有限深度的搜索。我正在使用以下代码来测试我的解决方案:

value(wire1,1).
connected(wire2, wire1).
connected(wire3, wire2).
connected(wire4, wire3).
connected(wire5, wire4).
connected(wire6, wire5).
connected(wire7, wire6).
connected(wire8, wire7).
connected(wire9, wire8).
value(W,X):-connected(W,V), value(V,X).

目标是这样的:
solve(value(w9,X), 3).     /*depth =3, it should return false*/
solve(value(w9,X), 20).    /*depth=20 is enought for returning X=1*/

顺便说一句,我的代码是
solve(true,_):-!.
solve((A,B),D) :-!, solve(A,D), solve(B,D).
solve(A,D) :- clause(A, B),solve(B,D2),D=D2+1,D>0).

但它不起作用属性(property)。你能帮助我吗?非常感谢提前

最佳答案

关于元编程的有趣页面来自一位优秀的开发人员:Markus Triska。
Here (Prolog 中的几个元解释器)你会发现理论和实践。例如:

... 另一组扩展旨在改进不完整的默认计算策略。我们从限制搜索树深度的 MI 开始:

        mi_limit(Goal, Max) :-
                mi_limit(Goal, Max, _).

        mi_limit(true, N, N).
        mi_limit((A,B), N0, N) :-
                mi_limit(A, N0, N1),
                mi_limit(B, N1, N).
        mi_limit(g(G), N0, N) :-
                N0 > 0,
                mi_clause(G, Body),
                N1 is N0 - 1,
                mi_limit(Body, N1, N).

关于prolog - 序言中的深度有限搜索( Vanilla 元解释器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868684/

相关文章:

parsing - 使用 prolog 构建解析树

c++ - 我可以从类型列表中声明模板特化吗?

c++ - 在编译时构建类型列表 - 无 C++11

ruby - 在 define_method 中使用局部变量

c++ - 使用 C++ 宏检查变量是否存在

prolog - 理解 Prolog 中的递归性

prolog - 如何验证序言文件子句数据库中是否存在规则

prolog - 如何使用SWI-Prolog ./2函数?

Prolog:创建子列表,给定两个索引

python - 如何在Python中修改def的行为?