1

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

加号和后继谓词在哪里 2 以前的练习点。我知道我没有使用后继谓词,但后来它似乎没那么有用。

这是我迄今为止尝试过的

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 是 []。

4

1 回答 1

1

我认为你在这里把事情弄得太复杂了。你可以定义successor为:

successor(T, [x|T]).

我们可以定义plus/3为:

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

这或多或少是 的实现append/3,只是这里我们检查第一个列表是否仅包含x

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

times([], _, []).

对于times/3第一项具有 shape 的情况[x|R],我们需要将第二项添加到调用times/3with的结果中R

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).
于 2019-08-26T17:02:32.620 回答