Сгенерировать список вместо ‘false’

#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 (я ограничиваюсь этим).