序言将列表存储在变量中

prolog store a list in a variable

prod([[vin(110 "Mercurey", 1978, 13), vin(120, "Macon", 1977, 12)],
      [viticulteur("Nicolas","Pouilly","Bourgogne"),
       viticulteur("Martin","Bordaux","Bordelais")]], R)

这个谓词正在返回一个列表:

R = [[vin(110, "Mercurey", 1978, 13), viticulteur("Nicolas", "Pouilly", "Bourgogne")], 
     [vin(110, "Mercurey", 1978, 13), viticulteur("Martin", "Bordaux", "Bordelais")], 
     [vin(120, "Macon", 1977, 12), viticulteur("Nicolas", "Pouilly", "Bourgogne")], 
     [vin(120, "Macon", 1977, 12), viticulteur("Martin", "Bordaux", "Bordelais")]]

我想将这个列表“R”存储在我程序的一个变量中。我怎样才能做到这一点?我想做的就像:

list = [1, 2, 3] (in Python)

vin6(prod([[vin(110, "Mercurey", 1978, 13), vin(120, "Macon", 1977 , 12)],
           [viticulteur("Nicolas", "Pouilly", "Bourgogne"),
            viticulteur("Martin", "Bordaux", "Bordelais")]], R))

在你的计划中让它成为事实。

list([1, 2, 3]).

现在您可以随时使用 list(Xs) 统一任何谓词中的变量。

这个:

R = [[vin(110, "Mercurey", 1978, 13), viticulteur("Nicolas", "Pouilly", "Bourgogne")], 
     [vin(110, "Mercurey", 1978, 13), viticulteur("Martin", "Bordaux", "Bordelais")], 
     [vin(120, "Macon", 1977, 12), viticulteur("Nicolas", "Pouilly", "Bourgogne")], 
     [vin(120, "Macon", 1977, 12), viticulteur("Martin", "Bordaux", "Bordelais")]]

是有效的序言;当 R 与该列表统一时它成立。例如

test(X) :-
    R = [[vin(110, "Mercurey", 1978, 13), viticulteur("Nicolas", "Pouilly", "Bourgogne")], 
     [vin(110, "Mercurey", 1978, 13), viticulteur("Martin", "Bordaux", "Bordelais")], 
     [vin(120, "Macon", 1977, 12), viticulteur("Nicolas", "Pouilly", "Bourgogne")], 
     [vin(120, "Macon", 1977, 12), viticulteur("Martin", "Bordaux", "Bordelais")]],
    nth1(1, R, X).

然后:

?- test(X).
[vin(110, "Mercurey", 1978, 13), viticulteur("Nicolas", "Pouilly", "Bourgogne")]

我认为几乎按照 Enigmativity 的建议进行操作可能更正常,而是将数据库用于单个条目而不是列表,如下所示:

wine(vin(110, "Mercurey", 1978, 13), viticulteur("Nicolas", "Pouilly", "Bourgogne")).
wine(vin(110, "Mercurey", 1978, 13), viticulteur("Martin", "Bordaux", "Bordelais")). 
wine(vin(120, "Macon", 1977, 12), viticulteur("Nicolas", "Pouilly", "Bourgogne")). 
wine(vin(120, "Macon", 1977, 12), viticulteur("Martin", "Bordaux", "Bordelais")).

test(Second) :-
    findall((Vin, Viti), wine(Vin, Viti), R),
    nth1(2, R, Second).

然后:

?- test(Second).
Second = (vin(110, "Mercurey", 1978, 13),viticulteur("Martin", "Bordaux", "Bordelais"))