列表中的Prolog用圆括号元素(List in Prolog with elements in r

2019-10-30 03:16发布

早上好

我有列表类同此: [(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

Answer 1:

这个给你:

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



Answer 2:

你不是真的想要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
| ?-


文章来源: List in Prolog with elements in round brackets
标签: list prolog