在Prolog的不同行上写一个列表的部分

时间:2018-01-21 09:40:17

标签: list prolog

我正在尝试创建一个程序,该程序将获取一个列表并在每行的一组 N 元素的不同行中写出所有元素。

e.g。用户查询print(3,[a,s,d,t,s,t]).

Prolog写道:

asd
tst

我被困在程序列出第一个(N)元素但不进入下一行的位置。任何人都可以帮我找出我的错误吗?

print(N,[H|T]):-
    N>=1,
    write(H),
    N1 is N-1,
    print(N1,T),
    nl,
    print(N,T).

3 个答案:

答案 0 :(得分:1)

您需要两个号码,因为您必须从每个新行的N开始。另外,有两个基本案例(行尾,列表结尾)。

print(N,L):-
  print(N,N,L).

print(N,I,[H|T]):-
  ( I >= 1 ->
    write(H),
    I1 is I-1,
    print(N,I1,T)
  ; nl,
    print(N,N,[H|T]) ).
print(_,_,[]).

答案 1 :(得分:1)

以下是使用switch(firstCB.selectedLabel) { case "True": { firstQ_txt.textColor = 0x00FF00; break; } case "False": { firstQ_txt.textColor = 0xFF0000; break; } } length/2的另一种方法。这是透明的,但我认为与托马斯的解决方案相比,它有点笨拙。

append/3

结果是:

print_substring([]).
print_substring([H|T]) :-
    write(H),
    print_substring(T).

print_substrings(N, L) :-
    length(S, N),
    (   append(S, R, L)
    ->  print_substring(S), nl,
        print_substrings(N, R)
    ;   print_substring(L), nl
    ).

注意:为变量或谓词选择名称时,最好避免使用非常通用的名称,例如| ?- print_substrings(3, [a,b,c,d,e]). abc de yes | ?- print恰好是某些Prolog中的库谓词,因此在您自己的代码中创建该名称的谓词可能会导致冲突。

答案 2 :(得分:0)

您可以将代码分为两部分。第一个函数print/2是API,print/3将是您的主要功能。

print/2将采用整数和原子列表并调用print/3

print(N, L) :-
  print(N, L, []).

print/3print/2实际上是相同的,除了print/3将在最后一个参数中采用Buffer(作为列表):

% if our list of atom is empty
% we just print Buf content and stop
print(_, [], Buf) :- 
  reverse(Buf, Atoms),
  atom_string(Atoms, String),
  format("~s~n", [String]).

% if our list of atom contain an head and tail
% we check if length of Buf is equal to N
print(N, [H|T], Buf) :-
  length(Buf, N), 
    % if its the case, we print our Buf and use
    % the rest of list of atoms
    reverse(Buf,Atoms), 
    atom_string(Atoms, String),
    format("~s~n", [String]), 
    print(N, [H|T])
  ;
    % else we take the head and concate it
    % with Buf.
    print(N, T, [H|Buf]).

您可以使用swipl解释器测试此代码。

?- [myprint].
?- print((3,[a,s,f,t,s,t]).
asf
tst
?- print(4,[a,s,f,t,s,t]).
asft
st