Prolog:将谓词和分号一起剪切以获得 TRUE
Prolog: cut predicate and semicolon together to obtain TRUE
我是 Prolog 的新手,我正面临一些练习,例如,这个练习要求我编写一个谓词 histogram/1 以将列表作为参数并打印带有数字出现的水平直方图列表中的 0..9。例如:
?- histogram([1,3,4,1,1,4,7]).
0
1 ***
2
3 *
4 **
5
6
7 *
8
9
true.
我的程序如下,并按要求工作,但我有一个疑问:正如你所看到的那样,我使用了 cut predicate 和分号(第一行),只是在直方图之后获得 TRUE(只是为了适应所提供的示例,我真的不在乎它!),如果您省略此操作,您将始终得到 FALSE,因为 N<10 将失败...
我的问题是:这是使用 cut 谓词的正确方法吗?如果没有,我该如何改进我的程序(任何其他建议将不胜感激)?
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,_).
并且整个程序可以使用 SWI-Prolog 库变得更短,例如
histogram(X) :-
forall(between(0,9,N), (findall(*,member(N,X),H), format('~d ~s~n', [N, H]))).
我是 Prolog 的新手,我正面临一些练习,例如,这个练习要求我编写一个谓词 histogram/1 以将列表作为参数并打印带有数字出现的水平直方图列表中的 0..9。例如:
?- histogram([1,3,4,1,1,4,7]).
0
1 ***
2
3 *
4 **
5
6
7 *
8
9
true.
我的程序如下,并按要求工作,但我有一个疑问:正如你所看到的那样,我使用了 cut predicate 和分号(第一行),只是在直方图之后获得 TRUE(只是为了适应所提供的示例,我真的不在乎它!),如果您省略此操作,您将始终得到 FALSE,因为 N<10 将失败... 我的问题是:这是使用 cut 谓词的正确方法吗?如果没有,我该如何改进我的程序(任何其他建议将不胜感激)?
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,_).
并且整个程序可以使用 SWI-Prolog 库变得更短,例如
histogram(X) :-
forall(between(0,9,N), (findall(*,member(N,X),H), format('~d ~s~n', [N, H]))).