Prolog 列出大小乘法

Prolog 列出大小乘法,prolog,successor-arithmetics,Prolog,Successor Arithmetics,我对Prolog还不熟悉,我正在努力了解列表。我正在努力解决的问题是: 给定列表形式的数字(1:[x],3:[x,x,x]),实现'times'谓词/3。 例如:时间([x,x],[x,x,x],R)。 R=[x,x,x,x,x,x] 加号和后继谓词,其中包含练习的前两个点。我知道我没有使用后继谓词,但后来它似乎没有那么有用 这就是我到目前为止所尝试的 successor([], [x]). successor([X|T], R) :- append([X|T], [X], R).

我对Prolog还不熟悉,我正在努力了解列表。我正在努力解决的问题是: 给定列表形式的数字(1:[x],3:[x,x,x]),实现'times'谓词/3。 例如:时间([x,x],[x,x,x],R)。 R=[x,x,x,x,x,x]

加号和后继谓词,其中包含练习的前两个点。我知道我没有使用后继谓词,但后来它似乎没有那么有用

这就是我到目前为止所尝试的

successor([], [x]).
successor([X|T], R) :- 
    append([X|T], [X], R).

plus(L1, L2, R) :- append(L1, L2, R).

times([], _, []).
times(_, [], []).
times([_], L, L).
times(L, [_], L).
times([_|T], L2, R) :- plus(L2, R, RN),
    times(T, L2, RN).
输出为:
R是[]。

我觉得你把这里的事情弄得太复杂了。您可以将继承者定义为:

successor(T, [x|T]).
plus([], T, T).
plus([x|R], S, [x|T]) :-
    plus(R, S, T).
我们可以将
plus/3
定义为:

successor(T, [x|T]).
plus([], T, T).
plus([x|R], S, [x|T]) :-
    plus(R, S, T).
这或多或少是
append/3
的实现,除了这里我们检查第一个列表是否只包含
x

对于
times/3
我们知道,如果第一项为空,则结果为空:

times([], _, []).
对于
times/3
,其中第一个项目具有形状
[x | R]
,我们需要使用
R
将第二个项目添加到调用
times/3
的结果中:

times([x|R], S, T) :-
    times(R, S, T1),
    plus(S, T1, T).
综上所述,我们得到:

successor(T, [x|T]).

plus([], T, T).
plus([x|R], S, [x|T]) :-
    plus(R, S, T).

times([], _, []).
times([x|R], S, T) :-
    times(R, S, T1),
    plus(S, T1, T).

您在这里试图用
附加([X | T],[X],R)
做什么?后继([X,X],R)应该产生R=[X,X,X]。所以我只是增加了一个元素,就像第一个列表中的头一样。另外,你有没有为Prolog准备好IDE?我已经配置了VS代码,但我认为可能会有更专业的东西出现。@CosminStoian在这一点上,IDE似乎有些过头了。我只是在用vim和做练习。再次感谢你!请注意,
次(A,B,[x])
不是终止。在@false:yes标签下可以找到更好的解决方案,我同意它并非在所有方向都有效。解决这个问题的一个快速方法是迭代第三个参数,这样至少可以实现终止。