#prolog
#пролог
Вопрос:
Этот пост посвящен программированию на прологе в целом, а не только swi-prolog.
floor_locations([ 0.0, 0.17, 0.33, 0.5, 0.67, 0.83, 1.0 ]).
cabin_location_is_reached( cabin_location, floor_location, true ) :-
abs( cabin_location - floor_location ) =< 0.01.
cabin_location_is_reached( cabin_location, floor_location, false ) :-
abs( cabin_location - floor_location ) > 0.01.
list_floors_to_be_served( [], [],_, [] ).
list_floors_to_be_served(
[request|floor_requests],
[floor_location|floor_locations],
cabin_location,
[has_to_be_served|floors_to_be_served_list] ) :-
cabin_location_is_reached(
cabin_location,
floor_location,
has_to_be_served ),
list_floors_to_be_served(
floor_requests,
floor_locations,
cabin_location,
floors_to_be_served_list ).
Вопрос в том:
list_floors_to_be_served(
[ false, false, true, false, false, false, true ],
floor_locations,
0.33,
X ).
И ожидаемый результат должен быть:
[false, false, false, false, false, false, true]
Текущий результат : false
:- (
Как исправить мои ошибки?
Комментарии:
1. В Prolog переменные должны начинаться с заглавной буквы! В этой программе нет переменных, только константы.
2. Это дважды опубликовано на форуме SWI-Prolog
Ответ №1:
Как прокомментировал Дэвид Тонхофер, в этой программе нет переменных. В нем есть другие ошибки, такие как: (a) в запросе переменная «floor_locations» не имеет значения. После некоторой детективной работы, вот оно:
floor_locations([ 0.0, 0.17, 0.33, 0.5, 0.67, 0.83, 1.0 ]).
cabin_location_is_reached( Cabin_location, Floor_location, true ) :-
abs( Cabin_location - Floor_location ) =< 0.01.
cabin_location_is_reached( Cabin_location, Floor_location, false ) :-
abs( Cabin_location - Floor_location ) > 0.01.
list_floors_to_be_served( [], [],_, [] ).
list_floors_to_be_served(
[Request|Floor_requests],
[Floor_location|Floor_locations],
Cabin_location,
[Has_to_be_served|Floors_to_be_served_list] ) :-
cabin_location_is_reached(Cabin_location, Floor_location, Has_to_be_served),
list_floors_to_be_served(Floor_requests, Floor_locations, Cabin_location,
Floors_to_be_served_list).
go(X) :-
floor_locations(Ls),
list_floors_to_be_served(
[ false, false, true, false, false, false, true ], Ls, 0.33, X).
Я определил предикат go /1 для повторного поиска параметров floor_locations, необходимых в вызове list_floors_to_be_served/4. Первый аргумент list_floors_to_be_serv/4 вообще не используется. И данный запрос возвращает:
?- go(X).
X = [false,false,true,false,false,false,false]
Чтобы получить X = [false, false, false, false, false, false, true], вам необходимо переопределить :
floor_locations([ 0.0, 0.17, 0.33, 0.5, 0.67, 0.83, 0.33 ]).
Довольно любопытная программа.
Комментарии:
1. Эта программа представляет собой фрагмент программы управления / управления лифтом на 7 этажей. Я сделал это на Java и C . Я пытаюсь перенести его в Prolog. Для меня это очень сложно, так как я старый процедурный программист.
2. Привет! У меня 64, продолжаю 65. Но я делал некоторые прологи, когда был моложе. Кстати, вы можете поместить ответ в свой пост на форуме SWI-PROLOG (я ограничиваюсь этим).