Поиск по глубине в прологе (ванильный мета-интерпретатор) - PullRequest
6 голосов
/ 23 октября 2011

Мне нужно изменить ванильный мета-интерпретатор, чтобы выполнить поиск с ограниченной глубиной.Я использую следующий код для проверки моего решения:

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

Но это не работает, собственность.Вы можете мне помочь?Большое спасибо заранее

Ответы [ 3 ]

4 голосов
/ 24 октября 2011

Интересная страница о метапрограммировании пришла от хорошего разработчика: Маркуса Триски. Здесь (пара мета-интерпретаторов в Прологе) вы найдете и теорию, и практику.Например:

... Другая группа расширений направлена ​​на улучшение стратегии вычисления неполных значений по умолчанию.Мы начинаем с 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 голосов
/ 24 октября 2011

Вы были почти там.Только последнее предложение нуждается в небольшой перестановке:

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 голосов
/ 02 мая 2015
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).
...