Пролог обрезал поведение оператора
У меня есть эти пункты:
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)
определения, которые вы можете найти ниже этого.
Мое чтение пошло так, потому что моя интерпретация среза такова: передайте выбор, сделанный до того, как встретите срез в этом теле предиката, и отбросьте предложения для этого предиката ниже предложения, содержащего срез.
Я надеюсь, что это хотя бы отдаленно полезно.