Как и в любом языке программирования, вы должны разбить это на шаги. Первый шаг, по вашим словам, «найти соединение, которое имеет символ, равный индексной переменной».
Это довольно просто:
predicate(Connections, [Index,Position], Remaining) :-
select(conn(Index, Position, _), Connections, Remaining).
predicate(Connections, [Index, Position2], Remaining) :-
select(conn(Index, _, Position2), Connections, Remaining).
У обоих есть анонимная переменная, которая является new_pos
, которую мы хотим сохранить, поэтому давайте ее сохраним:
predicate(Connections, [Index, Position], Remaining) :-
select(conn(Index, Position, NewPos), Connections, Remaining).
predicate(Connections, [Index, Position2], Remaining) :-
select(conn(Index, NewPos, Position2), Connections, Remaining).
Другой подход:
predicate(Connections, [Index, Position], Remaining) :-
select(conn(Index, Position, NewPos), Connections, Remaining) ;
select(conn(Index, NewPos, Position), Connections, Remaining).
На самом деле это было бы идеально, но нам нужно откуда-то вывести NewPos
, иначе Пролог никогда не покажет нам, с чем он унифицирован.
select_position(Connections, [Index,Pos], Remaining, NewPos) :-
select(conn(Index, Pos, NewPos), Connections, Remaining) ;
select(conn(Index, NewPos, Pos), Connections, Remaining).
Следующим шагом будет поиск связи. Это тоже не сложно:
find_with_position(Position, Connections, Connection) :-
member(Connection, Connections),
(Connection = conn(_, Position, _) ;
Connection = conn(_, _, Position)).
Оба они имеют некоторую логику особого случая для обработки того факта, что любой элемент может быть правильным. Вы можете рассмотреть возможность использования списков, чтобы вы могли просто использовать member.
Склеить их не сложно:
predicate(Connections, [Index, Position], Remaining, Target) :-
select_position(Connections, [Index, Position], Remaining, NewPos),
find_with_position(NewPos, Remaining, conn(Target,_,_)).
Попытайся:
?- predicate([conn(1,p1,p2), conn(4,p2,p3),
conn(3,p3,p1), conn(2,p6,p7)], [1, p2], Left, T).
Left = [conn(4, p2, p3), conn(3, p3, p1), conn(2, p6, p7)],
T = 3 ;
false.
У тебя тут много проблем. Если вы изучаете Prolog в классе, я рекомендую вам пройти обучение, например Изучите Prolog сейчас или Приключения Амзи.
person
Daniel Lyons
schedule
15.05.2013