Пролог обрезал поведение оператора

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

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 () и а (). Я думаю, что сокращение игнорирует ВСЕ предыдущие пункты выбора и не будет возвращаться.

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

2 ответа

Решение

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

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.

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

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

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

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

Другие вопросы по тегам