我正在尝试创建一个程序,该程序将获取一个列表并在每行的一组 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).
答案 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/3
和print/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