2013-05-15 2 views
1

У меня есть эти статьи:Пролог оператор покрой поведение

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). 

При запуске запроса с (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. 

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

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

ответ

0

я сделал некоторое чтение и разрез работает следующим образом:

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. 
1

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

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

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

Я надеюсь, что это, по крайней мере, полезно.