什么是prolog查询以查找可能的值

时间:2017-10-12 17:15:16

标签: 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 个答案:

答案 0 :(得分: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), (..., ...)].