2017-10-12 72 views
0

序言查詢這是我的Prolog程序:什麼是尋找可能的值

par(0,0). 
par(0,1). 
par(0,2). 
par(1,0). 
par(1,2). 
par(1,1). 
par(2,1). 
par(2,0). 
par(2,2). 

gp(X,Y):- par(X,Z),par(Z,Y). 

ggp(X,Y) :- par(X,Z), par(Z,W), par(W,Y). 

必須使用什麼查詢來獲取他可能的元組,以滿足規則的GP和GGP 我試着用GP(X ,Y)但不給我元組。 另外gp和ggp不相關。滿足GGP的元組不必一定滿足規則的GP

回答

1

,您只需要在「包」的XY連成一個元組,如:

tuple_gp((X,Y)) :- 
    gp(X,Y). 

tuple_ggp((X,Y)) :- 
    ggp(X,Y). 

這就可以回答:

?- tuple_gp(T). 
T = (0, 0) ; 
T = (0, 1) ; 
T = (0, 2) ; 
T = (0, 0) ; 
T = (0, 2) ; 
T = (0, 1) ; 
T = (0, 1) ; 
T = (0, 0) ; 
T = (0, 2) ; 
T = (1, 0) ; 
T = (1, 1) ; 
T = (1, 2) ; 
T = (1, 1) ; 
T = (1, 0) ; 
T = (1, 2) ; 
T = (1, 0) ; 
T = (1, 2) ; 
T = (1, 1) ; 
T = (2, 0) ; 
T = (2, 2) ; 
T = (2, 1) ; 
T = (2, 0) ; 
T = (2, 1) ; 
T = (2, 2) ; 
T = (2, 1) ; 
T = (2, 0) ; 
T = (2, 2). 

如果你想生成所有可能的元組的列表,您可以使用findall/3

?- findall((X,Y),gp(X,Y),L). 
L = [ (0, 0), (0, 1), (0, 2), (0, 0), (0, 2), (0, 1), (0, 1), (0, 0), (..., ...)|...]. 

?- findall((X,Y),ggp(X,Y),L). 
L = [ (0, 0), (0, 1), (0, 2), (0, 0), (0, 2), (0, 1), (0, 1), (0, 0), (..., ...)|...]. 

如果只想獲得獨特元組,你可以使用setof/3

?- setof((X,Y),X^Y^gp(X,Y),S). 
S = [ (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (..., ...)]. 
+0

好的,謝謝ü非常。我還有一個疑問。如果我想找到只產生gp(0,1)和ggp(1,2)的元組,那麼該怎麼辦? – confucious

+0

你是指只產生'gp(0,1)'和'ggp(1, 2)'?謂詞不會產生任何東西......謂詞只是「真」或「假」(或觸發錯誤)。 –

+0

在給定的事實中,如par(0,0),par(0,1)....假設你只有規則gp,那麼我們如何確定par()中的哪些組合可以將gp元組作爲(0,1) – confucious