考虑以下简单程序:
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))
]产生的答案。
问题是:
是否可以更改代码,以便在查询中,它在第一个析取和第二个解析的解决方案之间交替?
答案 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如何一次生成一对嵌套对结构。然后,第二个目标,即您的原始谓词,为该对生成a
和b
的所有可能组合。然后h / 2回溯到由pair / 2产生的下一对。等等。