早上好
我有列表类同此: [(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个要素:
1
2
3
我会感谢任何帮助:d
早上好
我有列表类同此: [(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个要素:
1
2
3
我会感谢任何帮助:d
这个给你:
write_list([]).
write_list([(A-_)|Tail]) :-
writeln(A),
write_list(Tail).
查询:
?- write_list([(1-4),(2-4),(3-4)]).
1
2
3
true
writeln/1
被简单地write/1
,接着nl
。
你不是真的想要write
结果,但他们提供作为参数。 在序言很多初学者卡住这一点。 此外,它的这种相同的逻辑应用到每个列表元素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
| ?-