列表大小乘法
Lists size multiplication
我是 Prolog 的新手,我正在努力了解列表。我正在努力解决的问题是:
给定列表形式的数字 (1 : [x], 3: [x, x, x]),实现 'times' 谓词 /3。
例如:times([x, x], [x, x, x], R)。
R = [x, x, x, x, x, x].
plus, and successor predicates where 2 previous points of the exercise.我知道我没有使用后继谓词,但后来似乎没那么有用。
这是我目前尝试过的方法
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
定义为:
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([], _, []).
并且对于第一项具有形状 [x|R]
的 times/3
,我们需要将第二项添加到使用 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).
我是 Prolog 的新手,我正在努力了解列表。我正在努力解决的问题是: 给定列表形式的数字 (1 : [x], 3: [x, x, x]),实现 'times' 谓词 /3。 例如:times([x, x], [x, x, x], R)。 R = [x, x, x, x, x, x].
plus, and successor predicates where 2 previous points of the exercise.我知道我没有使用后继谓词,但后来似乎没那么有用。
这是我目前尝试过的方法
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
定义为:
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([], _, []).
并且对于第一项具有形状 [x|R]
的 times/3
,我们需要将第二项添加到使用 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).