列出所有可能的解决方案 Prolog
Listing all possible solutions Prolog
我是 prolog 的初学者并且
我想列出所有变量的所有可能解决方案,例如:
word(V1,V2,V3) :- some code
我想要 V1
到 V3
的所有可能值,
所以不是 returning
?-word(V1,V2,V3).
V1 = x1,
V2 = x2,
V3 = x3;
V1 = y1,
V2 = y2,
V3 = y3.
它return
V1 = [x1, y1]
V2 = [x2, y2]
V3 = [x3, y3]
我尝试了 findall,但出现错误我不知道如何在这个示例中使用它。
您可以使用findall/3
来收集列表列表中的所有解决方案。例如,考虑程序:
word(x1, x2, x3).
word(y1, y2, y3).
您得到以下结果:
?- findall([V1,V2,V3], word(V1,V2,V3), M).
M = [[x1, x2, x3], [y1, y2, y3]].
得到的列表M
可以看作矩阵:
M = [[x1, x2, x3],
[y1, y2, y3]].
然而,你想要的答案是对应的转置矩阵:
T = [[x1, y1],
[x2, y2],
[x3, y3]].
要转置矩阵 M
,您可以按如下方式组合 findall/3
、maplist/3
and nth1/3
:
?- M = [[x1,x2,x3], [y1,y2,y3]], findall(L, maplist(nth1(_), M, L), T).
M = [[x1, x2, x3], [y1, y2, y3]],
T = [[x1, y1], [x2, y2], [x3, y3]].
因此,解决您问题的最终代码是:
words(V1, V2, V3) :-
findall([V1,V2,V3], word(V1,V2,V3), M),
findall(L, maplist(nth1(_), M, L), [V1,V2,V3]).
word(x1, x2, x3).
word(y1, y2, y3).
示例:
?- words(V1,V2,V3).
V1 = [x1, y1],
V2 = [x2, y2],
V3 = [x3, y3].
我是 prolog 的初学者并且 我想列出所有变量的所有可能解决方案,例如:
word(V1,V2,V3) :- some code
我想要 V1
到 V3
的所有可能值,
所以不是 returning
?-word(V1,V2,V3).
V1 = x1,
V2 = x2,
V3 = x3;
V1 = y1,
V2 = y2,
V3 = y3.
它return
V1 = [x1, y1]
V2 = [x2, y2]
V3 = [x3, y3]
我尝试了 findall,但出现错误我不知道如何在这个示例中使用它。
您可以使用findall/3
来收集列表列表中的所有解决方案。例如,考虑程序:
word(x1, x2, x3).
word(y1, y2, y3).
您得到以下结果:
?- findall([V1,V2,V3], word(V1,V2,V3), M).
M = [[x1, x2, x3], [y1, y2, y3]].
得到的列表M
可以看作矩阵:
M = [[x1, x2, x3],
[y1, y2, y3]].
然而,你想要的答案是对应的转置矩阵:
T = [[x1, y1],
[x2, y2],
[x3, y3]].
要转置矩阵 M
,您可以按如下方式组合 findall/3
、maplist/3
and nth1/3
:
?- M = [[x1,x2,x3], [y1,y2,y3]], findall(L, maplist(nth1(_), M, L), T).
M = [[x1, x2, x3], [y1, y2, y3]],
T = [[x1, y1], [x2, y2], [x3, y3]].
因此,解决您问题的最终代码是:
words(V1, V2, V3) :-
findall([V1,V2,V3], word(V1,V2,V3), M),
findall(L, maplist(nth1(_), M, L), [V1,V2,V3]).
word(x1, x2, x3).
word(y1, y2, y3).
示例:
?- words(V1,V2,V3).
V1 = [x1, y1],
V2 = [x2, y2],
V3 = [x3, y3].