2013-05-15 35 views
1

我有這方面的條款:Prolog的切割操作行爲

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()和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另外d(B,C)定義,你可能會在這個下面找到。

我的閱讀是這樣的,因爲我對剪裁的解釋是:承諾在這個謂詞體內遇到剪切之前作出的選擇,並在含有剪切的子句下面放棄這個謂詞的子句。

我希望這至少是遠程幫助。