早上好
我有类似于此的列表:[(1-4), (2-4), (3-4)]。我只想写圆括号的第一部分/第二部分/第三部分。我写了一个函数:
write_list([]).
write_list([Head|Tail]) :-
write(Head), nl,
write_list(Tail).它只写整支圆括号:
1-4
2-4
3-4
我希望我的输出成为圆括号的第一个元素:
1
2
3.
我将非常感谢您的帮助。
发布于 2018-01-06 20:19:50
给你:
write_list([]).
write_list([(A-_)|Tail]) :-
writeln(A),
write_list(Tail).查询:
?- write_list([(1-4),(2-4),(3-4)]).
1
2
3
truewriteln/1只是write/1,其次是nl。
发布于 2018-01-06 21:58:44
您并不是真的希望write结果,而是提供它们作为一个参数。Prolog中的许多初学者都被困在这一点上。而且,将相同的逻辑应用于每个list元素是非常常见的模式,因此Prolog有一个名为maplist的谓词,用于为您完成工作:
first_subterm(A-_, A). % First subterm of `A-_` is `A`
first_subterms(PairList, FirstSubTerms) :-
maplist(first_subterm, PairList, FirstSubTerms).你可以这样称呼它:
| ?- first_subterms([(1-4), (2-4), (3-4)], FirstSubTerms).
FirstSubTerms = [1,2,3]
yes
| ?-长时间递归形式与另一个答案中给出的类似:
first_subterms([], []). % The list of first subterms of [] is []
first_subterms([(A-_)|Pairs], [A|SubTerms]) :-
first_subterms(Pairs, SubTerms).注意,“圆括号”是括号,在Prolog中,在这个上下文中,只执行术语的分组。结果表明,[(1-4), (2-4), (3-4)]在这里的行为与[1-4, 2-4, 3-4]一样,因为,在列表表示法中的优先级低于-。这也是我们的行为:
| ?- first_subterms([1-4, 2-4, 3-4], FirstSubTerms).
FirstSubTerms = [1,2,3]
yes
| ?-https://stackoverflow.com/questions/48130976
复制相似问题