Prolog序列

时间:2016-11-25 07:07:10

标签: prolog

美好的一天,

我有一项任务(不是家庭作业),但是考试准备问题。给定n的值,其中n>我需要找出3 ** n的值。我确实有一些有用的东西。

% expo
expo([],[]).
expo([X|T], [Y|Result]):-
    number(X),
    Y is 3 ^ X,
    expo(T,Result).
expo([ThrowAway|Tail], [ThrowAway|Result]):-
    expo(Tail,Result).

last([X]):-
    write("M = "),
    write(X).

last([Y|Tail]):-
    last(Tail).

do_list(N) :-
    findall(Num, between(0, N, Num), L),
    expo(L, E),
    last(E).  

当我在控制台上运行时:

do_list(4).
M = 81
true.

所以它确实给了我想要的东西。但是必须使用递归解决方案吗?我只是想生成一个数字序列并使用这些数字作为我所做的指数,但我必须为此创建两个列表。

理想情况下,我想这样做:

do_list(4, M).
M = 81
true.

如果没有两个清单,这可以做到这一点吗?没有递归是否可能?我是Prolog的新手,所以它让我有点习惯了"思考"在Prolog。

TIA,

COSON

1 个答案:

答案 0 :(得分:0)

如果你想在列表的所有元素中执行某些操作,那么大多数时候你需要递归(除了像你使用像fundall/3这样的谓词进行递归的情况......)。

如果你想在参数中返回你的结果而不是只打印它,那么你需要上面的谓词两个列表(一个是输入,另一个是输出)。

虽然我不明白为什么不写作:

find_pow(Input,Output):-Output is 3^Input.

根据我的理解,你为每个i< = n计算3 ^ i并保留可以独立完成的最后一个元素。因此,如果我理解你正在尝试做什么,这可以在不使用列表和递归的情况下完成(如果你使用预定义的pow函数^ else,如果你编写一个计算幂3 ^ n的谓词,那么你将使用递归.. 。)。

示例:

?- find_pow(4,X).
X = 81.