2017-01-25 3 views
0

Я пытаюсь создать правило для присвоения, но это не похоже на работу, присвоение простая карта трубки, и одна из задач состоит в том, чтобы найти:Пролог adjecent2interchange

станции, которые являются смежными и обмена, но не являются общими станциями.

Я уже сделал prequisite задачи, чтобы найти, сколько линий проходят через станцию:

station_numlines(Station,NumberOfLines) :- 
    findall(M, station(Station,M), Ms), 
    sort(Ms, SortedMs), 
    length(SortedMs, NumberOfLines). 

Теперь Ive получил, чтобы сделать правило, которое проверяет, какие станции не перепутать станции, в формате:

adjecent2interchange(NonInterStation, InterChangeStation) :- 

Как я могу использовать station_numlines, чтобы найти все станции обмена?

Как я предполагаю, запустите количество строк на всех станциях из списка, а затем просто сохраните его и распечатайте все станции обмена.

Я просто безнадежен в том, чтобы наложить это на себя с почти 0 опытом на очень запутанном языке.

станции:

station(al,metropolitan). 
station(bs,metropolitan). 
station(fr,metropolitan). 
station(kx,metropolitan). 
station(ls,metropolitan). 

station(bg,central). 
station(cl,central). 
station(lg,central). 
station(ls,central). 
station(nh,central). 
station(oc,central). 
station(tc,central). 

station(br,victoria). 
station(fp,victoria). 
station(kx,victoria). 
station(oc,victoria). 
station(vi,victoria). 
station(ws,victoria). 

station(ec,bakerloo). 
station(em,bakerloo). 
station(oc,bakerloo). 
station(pa,bakerloo). 
station(wa,bakerloo). 

station(em,northern). 
station(eu,northern). 
station(ke,northern). 
station(tc,northern). 
station(ws,northern). 

%adjecent stations % 

% Central line 

adjacent(nh,lg,central,4). 
adjacent(lg,oc,central,4). 
adjacent(oc,tc,central,4). 
adjacent(tc,cl,central,4). 
adjacent(cl,ls,central,4). 
adjacent(ls,bg,central,4). 

% Victoria Line 
adjacent(br,vi,victoria,4). 
adjacent(vi,oc,victoria,4). 
adjacent(oc,ws,victoria,4). 
adjacent(ws,kx,victoria,4). 
adjacent(kx,fp,victoria,4). 

% Northern Line 
adjacent(ke,em,northern,4). 
adjacent(em,tc,northern,4). 
adjacent(tc,ws,northern,4). 
adjacent(ws,eu,northern,4). 

% Metropolitan Line 
adjacent(al,ls,metropolitan,4). 
adjacent(ls,kx,metropolitan,4). 
adjacent(bs,fr,metropolitan,4). 

% Bakerloo Line 
adjacent(ec,em,bakerloo,4). 
adjacent(em,oc,bakerloo,4). 
adjacent(oc,pa,bakerloo,4). 
adjacent(pa,wa,bakerloo,4). 

ответ

1

Ключ к этому, как и во всех программах на Прологе, чтобы разложить проблему на составные части. Будем беспокоиться о «развязках», «без обмена» и «смежности» отдельно.

Учитывая ваше определение station_numlines/2, вы можете определить:

Edit: Вашего определения station_numlines/2 не очень хорошо, потому что он не может быть использован для перечисления всех станций и количества линий они на, как в station_numlines(Station, N) с несвязанными аргументами. Вот определение, которое делает это возможным:

station_numlines(Station,NumberOfLines) :- 
    setof(M, M^station(Station,M), Ms), 
    length(Ms, NumberOfLines). 

Учитывая это, вы можете определить:

interchange_station(Station) :- 
    station_numlines(Station, N), 
    N > 1. 

и

non_interchange_station(Station) :- 
    station_numlines(Station, 1). 

Edit: Даже без сложности station_numlines/2 мы могут найти относительно простые альтернативные определения для этих предикатов:

interchange_station(Station) :- 
    station(Station, Line1), 
    station(Station, Line2), 
    dif(Line1, Line2). % or: Line1 \= Line2 

non_interchange_station(Station) :- 
    station(Station, _SomeLine), 
    \+ interchange_station(Station). 

Это, пожалуй, более чистый, но он перечисляет станции обмена несколько раз. В любом случае:

Тогда, если у вас также есть определение adjacent/2, ваш предикат становится:

adjacent_to_interchange(NonInterchange, Interchange) :- 
    non_interchange_station(NonInterchange), 
    interchange_station(Interchange), 
    adjacent(NonInterchange, Interchange). 
+0

нормально, у получить его сейчас больше, однако с station_numlines, используется, чтобы найти, сколько линий проходят через станции, и для этого требуется ввод одной станции, как бы я использовал ее для поиска только станций NonInterchange? как будет выглядеть тестовый пример? – Bart123

+0

Я не уверен, что вы имеете в виду. Запрос 'non_interchange_station (Station)' должен перечислять все 'Station', которые не являются развязками. Тем не менее, я не могу проверить это без (некоторых) ваших фактов 'station/2'. –

+0

Я имею в виду, что использование non_interchange_station (Station) позволяет мне проверять, является ли одна из станций, которые я вводил, true, но если бы я хотел протестировать все станции, перечисленные сразу ?. поэтому запрос должен выглядеть как non_interchange_station (br), и он возвращает true, что это станция без изменений. Если я просто использую non_interchange_station (Station), это дает мне ложный результат. Так как это можно сделать, чтобы я мог использовать предикат для отображения всех станций, которые не меняются? – Bart123