错误学习Prolog

时间:2014-09-18 18:54:19

标签: prolog

我是这种语言的新手,所以,我正在练习我在网上找到的一些练习,这个人说如果给出一个“阵列”你就要返回这个数字

即:

func([1,22,4],R).

R= 1224.

好的,所以......我想我有一个想法,但就像我说的那样,我很喜欢这个,所以,就是这样,

我取出阵列的“头部”并按“阵列”的长度驱动它,然后抓住尾巴重复这个过程...

这是我在网上找到的:

power(0,N,0) :- N>0.
power(X,0,1) :- X>0.
power(X,N,V) :- X>0, N>0, N1 is N-1, power(X,N1,V1), V is V1*X.

我的代码:

func(Number,Answer) :-
    Pow is length(Number,P),
    trab(Number,Number,R,Pow).

trab(Number,[X|XS],R,Pot) :-
    R1 is (power(X,Pow),R2),
    R is R+R1,
    trab(Numero,XS,R,Pot-1).

我知道这一切都错了,但是,你们可以帮帮我吗?

感谢。

3 个答案:

答案 0 :(得分:1)

该示例表明func/2谓词只是连接第一个参数中传递的列表中的所有元素。如果是这样,请查看标准谓词number_codes/2atom_codes/2atom_concat/3的文档。另请注意,func/2谓词需要“遍历”列表,这可以使用递归定义轻松完成。最后,请注意,您需要一种方法来累积中间串联结果,直到到达输入列表的末尾。

答案 1 :(得分:1)

作弊(仅限SWI-Prolog):

func(A,B) :- atomic_list_concat(A,T),atom_number(T,B).

现在代码:

func(Number,Answer):-
  Pow is length(Number,P), % P is a singleton
  trab(Number,Number,R,Pow). % R is a singleton

修改后的语法可以是

func(Numbers,Answer):-
  length(Numbers,Pow),
  trab(Numbers,Pow,Answer).

但无论如何它都不会起作用:你的元素位置可能超过1位 (如22),然后就像战俘打算做的那样,对最左边的人进行预先计算是虚幻的。 相反,您必须沿着列表向下走到最后一个元素,其中指数为0

?- X is 10^0.
X = 1.

并计算指数以回传'对于左边的数字,占数字的大小。这很复杂......让我们假设我们输入的数字最多为2位数(0..99),那么基本情况可能是

trab([Digit], Pow, Answer) :-
  Expo is 0,
  Answer is Digit * 10^Expo,
  increment_expo(Digit, Expo, Pow).

和increment_expo必须检查Digit是否落在0..9或10..99等

注意:与您的代码不同,Pow是输出,而不是输入。

更容易遵循保罗的建议。

答案 2 :(得分:1)

我建议使用一个累加器,它包含代表仍然需要处理的部分之前的列表的数字。

你必须将累加器乘以10到列表第一个元素的位数的幂,并将第一个元素添加到它。然后你可以递归地继续。如果列表为空,我们就完成了:

func(List,N) :-
    func2(List,0,N).

func2([],Acc,Acc).   % Base case: just return the accumulator
func2([H|T],Acc,N) :-
    Digits is floor(log(10,H)) + 1,   % Digits is the numbers of digits
    % integer(...) is needed because ** returns a float:
    NewAcc is Acc * integer(10**Digits) + H,
    func2(T,NewAcc,N).

更新:我意识到log/2是特定于SICStus的,因为SWI使用log10(H)而不是log(10,H)