Пролог убрать больше одного факта и потом утверждать - PullRequest
0 голосов
/ 03 июня 2018
:- dynamic flat/3.
addr('Nollendorfstr',5).
addr('Nollendorfstr',14).
addr('Nollendorfstr',18).
addr('Maxplanckstr',2).

flat([16,12,4],400.35, addr('Nollendorfstr',14)).
flat([14,13,4],380.00, addr('Nollendorfstr',18)).
flat([20,18,4,5],650.80, addr('Nollendorfstr',5)).
flat([9,17,19,20],870.70, addr('Maxplanckstr',2)).

У нас для каждой квартиры три аргумента.Итак, flat(array of rooms, price, address).

changeprice(Street):-
   retract(flat(Rooms,Price,addr(Street,Num))),
   Newprice is Price - (Price / 10),                         
   asserta(flat(Rooms,Newprice,addr(Street,Num))).

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

, поэтому, когда я поставлю туда changeprice('Nollendorfstr'). Это просто изменит одиниз них.Как я могу изменить их все?

1 Ответ

0 голосов
/ 03 июня 2018

Вы можете использовать либо цикл, управляемый отказом (который получает свое название от использования явного сбоя после обработки элемента, чтобы вернуться к обработке следующего элемента):

changeprice(Street) :-
    retract(flat(Rooms,Price,addr(Street,Num))),
    Newprice is Price - (Price / 10),                      
    asserta(flat(Rooms,Newprice,addr(Street,Num))),
    fail.
changeprice(_).

Или стандарт де-фактоforall/2 мета-предикат (где первый аргумент можно интерпретировать как генератор возможных решений, которые проверяются вторым аргументом, test part):

changeprice(Street) :-
    forall(
        retract(flat(Rooms,Price,addr(Street,Num))),
        (   Newprice is Price - (Price / 10),                      
            asserta(flat(Rooms,Newprice,addr(Street,Num)))
        )
    ).

В данном конкретном случае оба решения эквивалентны.Но обратите внимание, что циклы с ошибками и вызовы forall/2 имеют разную семантику.Цикл, управляемый отказом, может маскировать неожиданный отказ.Но вызов forall/2 завершится неудачей, а не завершится успешно, если второй аргумент окажется неудачным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...