【问题标题】:How to print prolog list variable's output on separate lines?如何在单独的行上打印序言列表变量的输出?
【发布时间】:2021-10-06 14:56:44
【问题描述】:

初始代码:

nutrition(fruits, NutritionList) :- 
        findall(Nutrition, fruitNutrition(Nutrition), NutritionList).

这样做的问题是它试图在 1 行上打印所有营养,而我希望它们在单独的行上。

得到:

NutritionList = [a,b,c,d]; 

通缉:

NutritionList = 
a 
b 
c
d 

然后我尝试了在另一个 SO 答案中找到的这种方法:

nutrition(fruits, NutritionList) :- 
            findall(Nutrition, fruitNutrition(Nutrition), NutritionList),
            maplist(writeln, NutritionList). 

但这样做的问题是它不会在顶部打印变量名称,并且还会在单独的行上打印一次输出,并以旧方式打印一次,例如:

a
b
c
d
NutritionList = [a,b,c,d]

如何获得我想要的格式的输出(在上面的粗体 wanted 下)?

【问题讨论】:

    标签: list prolog logic swi-prolog


    【解决方案1】:

    这可能不是最佳实践,但您可以定义 SWI-Prolog 动态谓词 portray/1 以在打印特定术语时更改系统的行为。

    fruitNutrition(a).
    fruitNutrition(b).
    fruitNutrition(c).
    fruitNutrition(d).
    
    nutrition(fruits, mylist(NutritionList)) :-
       findall(Nutrition, fruitNutrition(Nutrition), NutritionList).
    
    portray(mylist(List)) :- 
       nl, 
       maplist(writeln, List).
    

    例子:

    ?- nutrition(fruits, NutritionList).
    NutritionList = 
    a
    b
    c
    d
    .
    
    ?- nutrition(fruits, mylist(NutritionList)).
    NutritionList = [a, b, c, d].
    
    ?- print([one, two, three]).
    [one,two,three]
    true.
    
    ?- print(mylist([one, two, three])).
    
    one
    two
    three
    true.
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2016-12-16
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多