2011-10-23 17 views
6

限られた深さで検索するために、バニラメタインタープリタを変更する必要があります。私は私のsollutionをテストするための次のコードを使用しています:深さが制限されたプロローグ検索(バニラメタインタープリタ)

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). 

をtargetがそのようなものです:私のコードは

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). 

ですちなみに

solve(value(w9,X), 3).  /*depth =3, it should return false*/ 
solve(value(w9,X), 20). /*depth=20 is enought for returning X=1*/ 

しかし、それはドン仕事の性質。手伝って頂けますか?事前に多くのお礼ありがとうございます

答えて

4

メタプログラミングの興味深いページは良い開発者から来ました: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). 
3

あなたはほぼそこにいました。唯一の最後の節では、わずかの並べ替えを必要とします:

solve(A, D) :- clause(A, B), D1 is D - 1, D1 > 0, solve(B, D1). 

?- solve(value(wire9, X), 9).  ===> false. 
?- solve(value(wire9, X), 10).  ===> X = 1. 
+0

あなたは深さテストが最初に来るように、体内の目標並べ替えることができます: '(A、D)を解く: - D> 1、句を( A、B)、D1はD - 1、solve(B、D1)。 – repeat

-1
dls(X,X,[X],L):- 
    L >0 goal(X). 
dls(X,Y,[A|p],L):- 
    L > 0 ,goal(Y) , 
    move(X,Y), 
    L1 is L - 1 , 
    dls(Z,Y ,P,L1). 
+0

正しい構文に固執してください。 – false

関連する問題