1

Prolog,递归函数:我希望它使用列表的每个元素打印 C,例如:C=30 和 [H|T]= [-9,-10,-30]

myfunc(C,[H|T]):-   
    (\+([H|T]=[])),
    write(C), write(' with '), write(H), nl,
    myfunc(C,T).

我在开始时检查列表的头部不为空。它给了我这个输出

30 with -9
30 with -10
30 with -30

    (32 ms) no

这个输出是我想要的,但我不想在最后得到一个“否”,因为这会使父函数也失败!我怎样才能将其删除并改为“是”?

4

2 回答 2

3

简单的方法:只需添加一个带有空列表的基本案例。

myfunc(_, []) :- !.

myfunc(C,[H|T]):-   
    write(C), write(' with '), write(H), nl,
    myfunc(C,T).

测试:

?- myfunc(30, [1, 2, 3]).
30 with 1
30 with 2
30 with 3
true.

我不知道这是否是最好的方法,但是您没有向我们提供有关您的整个程序的太多详细信息,因此我选择了对您的谓词进行小的修改。

于 2012-11-30T20:04:03.237 回答
2

如果你的 Prolog 中有 maplist,你可以写

myfunc(N, L) :-
    maplist(my_write(N), L).


my_write(N, Val) :-
    format('~w with ~w~n', [N, Val]).

使用 SWI-Prolog 和模块lambda

:- use_module(library(lambda)).

myfunc(N, L) :-
    maplist(\X^format('~w with ~w~n', [N, X]), L).
于 2012-11-30T21:46:50.463 回答