Prolog - 递归谓词输出5-1然后再输回1-5

时间:2017-11-26 12:05:23

标签: prolog

我有以下递归谓词,从1-5输出星号。有人可以告诉我,我将如何反向这样做,所以像下面预期的输出是我想要实现的。谢谢。

预期输出

*****
****
***
**
*
*
**
***
****
*****

实际输出

*
**
***
****
*****

代码

asterisk :- asterisk(0, 5).

asterisk(A, B) :- A < B, count(0, A), A1 is A+1, asterisk(A1, B).
asterisk(A, B) :- A >= B.

num(X, Y) :- X =< Y, write('*'), X1 is X+1, num(X1,Y).
num(X, Y) :- X > Y, nl.1

2 个答案:

答案 0 :(得分:0)

这里的解决方案。我创建了两个谓词,一个用于打印鞋面,另一个用于打印下半部分。

printAsterisk(0):-
    nl.
printAsterisk(I):-
    I \= 0,
    write("*"),
    I1 is I-1,
    printAsterisk(I1).

printLower(N,N).
printLower(N,I):-
    I \= N,
    printAsterisk(I),
    I1 is I+1,
    printLower(N,I1).

printUpper(_,0).
printUpper(N,I):-
    I \= 0,
    printAsterisk(I),
    I1 is I-1,
    printUpper(N,I1).

asterisk(N):-
    N1 is N+1,
    printUpper(N,N),
    printLower(N1,1).

查询:?-asterisk(5).

*****
****
***
**
*
*
**
***
****
*****

答案 1 :(得分:0)

请改为尝试:

?- asterisk(5).

build(0) :- nl.
build(N) :-
    N>0,
    write("*"),
    N2 is N-1,
    build(N2).

asterisk(0).
asterisk(N) :-
    N>0,
    build(N),
    N2 is N-1,
    asterisk(N2),
    build(N).

我明白了:

*****
****
***
**
*
*
**
***
****
*****