Поведение оператора сокращения пролога

У меня есть такие пункты:

a(1).
a(2).
b(a).
c(A,B,C) :- a(A),d(B,C).
c(A,B,C) :- b(A),d(B,C).
d(B,C) :- a(B),!,a(C).
d(B,_) :- b(B).

Когда я запускаю запрос c(X,Y,Z), ответы следующие:

X = 1, Y = 1, Z = 1 ;
X = 1, Y = 1, Z = 2 ;
X = 2, Y = 1, Z = 1 ;
X = 2, Y = 1, Z = 2 ;
X = a, Y = 1, Z = 1 ;
X = a, Y = 1, Z = 2.

Таким образом, оператор отсечения (здесь d(B,C):-a(B),!,a(C)) игнорирует самые последние точки выбора, т. е. не выполняет дальнейший поиск d() и а(). Я думал, что разрез игнорирует ВСЕ предыдущие точки выбора и не будет возвращаться.

Может кто-нибудь объяснить точное поведение и почему я ошибаюсь?


person Rayhunter    schedule 15.05.2013    source источник


Ответы (2)


Поскольку я не сразу понял ваше объяснение того, что делает разрез, я посмотрел ваш код. Мое чтение было примерно таким:

  • c(A,B,C) is true when:
    • a(A) and d(B,C),
    • или b(A) и d(B,C)
  • d(B,C) верно, когда a(B), но только для первого a(B), с которым вы сталкиваетесь, и не ищите никаких других определений d(B,C), которые вы можете найти ниже этого.

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

Я надеюсь, что это хотя бы отдаленно полезно.

person Community    schedule 15.05.2013

Я немного почитал, и разрез работает следующим образом:

1. Kills off the parent choice-point
2. Commits to all the choices made going through the rule

Таким образом :

1. d(B,_) :- b(B). is not explored
2. B in d(B,C) :- a(B),!,a(C). is irrevocably bound to 1.
person Rayhunter    schedule 15.05.2013