2017-01-07 8 views
1

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

station(aldgate,metropolitan). 
station(brixton,victoria). 
station(baker,metropolitan). 

Я пытаюсь разработать правило, которое будет проверять, находятся ли две станции в одной строке и какая строка. Например, aldgate и baker находятся на той же строке, metropolitan.

Любые идеи?

+3

Вы вообще что-то пробовали? Если вы не знаете, с чего начать, вы должны попробовать учебник Prolog (* например. *, [Learn Prolog Now] (learnprolognow.org)). – lurker

+0

Спасибо, человек, посмотрел на сайт, и это очень полезно! –

ответ

3

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

Примером может служить следующее правило

sameLine(Stat1, Stat2, Line) :- 
    station(Stat1, Line), 
    station(Stat2, Line), 
    Stat1 \= Stat2. 

, который является гибким.

Он может проверить пара станции находится в одной и той же линии (вызов sameLine(aldgate, baker, metropolitan) возвращение правда, называя sameLine(aldgate, baker, Line) возвращение истинного и унифицировать Line с metropolitan), но могут найти пары станций линии (вызов sameLine(Stat1, Stat2, metropolitan) возвращающие в два раза, объединяет Stat1 с aldgate и Stat2 с baker (в первый раз) и наоборот (второй раз).

Соблюдать ограничение

Stat1 \= Stat2. 

Это навязать, что две станции различны.

Если вы хотите, чтобы sameLine(aldgate, aldgate, Line) верн. Объединив Line с metropolitan, вы можете удалить его.

Если вы, в противном случае, хотите, чтобы избежать двойных результатов (aldgate/baker и baker/aldgate, на собственном примере, вызывая sameLine(Stat1, Stat2, metropolitan)) вы можете наложить, что Stat1 это не только отличается от Stat2, но и то, что это «до» Stat2, замена

Stat1 \= Stat2 

с

Stat1 @< Stat2 

Но, таким образом, вы получите истинное от sameLine(aldgate, baker, Line), но false (потому что baker не «до» aldgate) от sameLine(baker, aldgate, Line).

 Смежные вопросы

  • Нет связанных вопросов^_^