在Prolog中的Disjunctions之间交替

时间:2016-05-15 00:02:52

标签: prolog

考虑以下简单程序:

import selenium
from selenium import webdriver
driver = webdriver.Chrome()


def expand_shadow_element(element):
  shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
  return shadow_root

selenium.__file__
driver.get("chrome://downloads")
root1 = driver.find_element_by_tag_name('downloads-manager')
shadow_root1 = expand_shadow_element(root1)

root2 = shadow_root1.find_element_by_css_selector('downloads-toolbar')
shadow_root2 = expand_shadow_element(root2)

root3 = shadow_root2.find_element_by_css_selector('cr-search-field')
shadow_root3 = expand_shadow_element(root3)

search_button = shadow_root3.find_element_by_css_selector("#search-button")
search_button.click()

查询:

h(n0).
h(p(A,N)) :- (A=a, h(N)) ; (A=b , h(N)).

...

由于第一个析取[1 ?- h(p(A,N)). A = a, N = n0 ; A = a, N = p(a, n0) ; A = a, N = p(a, p(a, n0)) ; A = a, N = p(a, p(a, p(a, n0))) ; A = a, N = p(a, p(a, p(a, p(a, n0)))) ; ]产生无数个答案,因此无法显示第二个析取[(A=a, h(N))]产生的答案。

问题是:

是否可以更改代码,以便在查询中,它在第一个析取和第二个解析的解决方案之间交替?

1 个答案:

答案 0 :(得分:4)

为了公平地列出h / 1的结果,你可以使用一个辅助谓词,比如说h2 / 2包含两个目标:1)一个谓词对/ 1只描述你的解决方案的结构具体价值观:

pairs(n0).
pairs(p(A,N)) :-
   pairs(N).

并得出以下答案:

   ?- pairs(X).
X = n0 ? ;
X = p(_A,n0) ? ;
X = p(_A,p(_B,n0)) ? ;
X = p(_A,p(_B,p(_C,n0))) ? 
...

2)你的谓词h / 1是描述变量_A, _B, _C,...实际上是什么的第二个目标:

h2(X) :-
   pairs(X),
   h(X).

如果查询此谓词,则会得到所需的结果:

   ?- h2(X).
X = n0 ? ;
X = p(a,n0) ? ;
X = p(b,n0) ? ;
X = p(a,p(a,n0)) ? ;
X = p(a,p(b,n0)) ? ;
X = p(b,p(a,n0)) ? ;
X = p(b,p(b,n0)) ? ;
X = p(a,p(a,p(a,n0))) ? ;
...

注意,第一个目标对/ 2如何一次生成一对嵌套对结构。然后,第二个目标,即您的原始谓词,为该对生成ab的所有可能组合。然后h / 2回溯到由pair / 2产生的下一对。等等。