Prolog 序言:将谓词和分号剪切在一起以获得TRUE

Prolog 序言:将谓词和分号剪切在一起以获得TRUE,prolog,Prolog,我不熟悉Prolog,我面临一些练习,例如,这一个要求我写一个谓词直方图/1,以列表为参数,打印一个水平直方图,其中数字0..9出现在列表中。例如: ?- histogram([1,3,4,1,1,4,7]). 0 1 *** 2 3 * 4 ** 5 6 7 * 8 9 true. 我的程序如下所示,并按要求工作,但我有一个疑问:正如您所看到的,我以这种方式使用了切割谓词和分号(第一行),只是为了在直方图之后获得TRUE(只是为了符合提供的示例,我并不真的关心它!),

我不熟悉Prolog,我面临一些练习,例如,这一个要求我写一个谓词直方图/1,以列表为参数,打印一个水平直方图,其中数字0..9出现在列表中。例如:

?- histogram([1,3,4,1,1,4,7]).

0 

1 ***

2

3 *

4 **

5

6

7 *

8

9

true.
我的程序如下所示,并按要求工作,但我有一个疑问:正如您所看到的,我以这种方式使用了切割谓词和分号(第一行),只是为了在直方图之后获得TRUE(只是为了符合提供的示例,我并不真的关心它!),如果忽略此项,则会得到FALSE,因为N=0, 可能吧

代替
(打印(0,X);!)
您可以编写
(打印(0,X);true)
,以获得相同的效果。
histogram(X):-
   valid(X),
   (  print(0,X)
   ;  !
   ).

print(N,X):-
   write(N) , tab(2), count(N,X) , nl,
   N1 is N+1,
   N1 < 10 ,
   print(N1,X).

count(_,[]).
count(E,[E|C]):-
   write('*') ,
   count(E,C).
count(E,[Y|C]):-
   E\=Y ,
   count(E,C).

valid([]).
valid([X|T]):-
   integer(X),
   X>=0,
   X<10,
   valid(T).
print(N,X):- N < 10, write(N), tab(2), count(N,X), nl, N1 is N+1, print(N1,X).
print(10,_).
histogram(X) :-
    forall(between(0,9,N), (findall(*,member(N,X),H), format('~d ~s~n', [N, H]))).