Пролог - Нахождение пути и длина данного отношения - PullRequest
0 голосов
/ 11 декабря 2018

Я только начал изучать Пролог и хотел лучше понять Pathfinding.У меня есть несколько примеров отношений, однако я не знаю, как найти путь и длину отношений, когда отношения цикличны.Я пытался создать список, который документирует посещенные узлы, но я продолжаю получать ошибки.

Ниже приведены несколько примеров, а также моя попытка найти путь с учетом отношения, источника, цели, списка путей и длины):

is_a(parallelogram, quadrilateral).
is_a(trapezoid, quadrilateral).
is_a(rhombus, parallelogram).
is_a(rectangle, parallelogram).
is_a(square, rhombus).
is_a(square, rectangle).

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

friend(alice, bob).
friend(bob, carol).
friend(carol, daniel).
friend(carol, eve).

friends(A,B) :- 
    friend(A,B); 
    friend(B,A).

transit(Rel, S, T) :- 
    call(Rel, S, X), 
    (X = T; transit(Rel, X, T)).

path_(Rel,Source,Target,Path,Len) :-
    path_(Rel,Source,Target,Path,Len,[]).

path_(Rel,Source,Target,Path,Len,Visited) :-
    transit(Rel,Source,Target),
    transit(Rel,Source,Mid),
    Mid == Target, !,
    append(Visited,[Source,Target],Path),
    length(Path,L),
    Len is L+1.

path_(Rel,Source,Target,Path,Len,Visited) :-
    transit(Rel,Source,Target),
    transit(Rel,Source,Mid),
    not(member(Mid,Visited)),
    path_(Rel,Mid,Target,Path,Len,[Source|Visited]).

Выше приведена моя вторая попытка, ноЯ получаю ошибки на все.Моя первая попытка работала только с нециклическими путями, такими как отношения is_a, которые отмечены ниже:

path0(Rel,From,To,[From,To],2) :-
    transit(Rel,From,To),
    call(Rel, From, To).

path0(Rel,From,To,[From|Xs],Len) :-
    transit(Rel,From,X),
    call(Rel,From,X),
    path0(Rel,X,To,Xs,_),
    length(Xs, L),
    Len is L+1.
...