【问题标题】:Lists size multiplication列出大小乘法
【发布时间】:2019-08-26 16:56:51
【问题描述】:

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

【问题讨论】:

  • 你想在这里用append([X|T], [X], R)做什么?
  • successor([x, x], R) 应该产生 R = [x, x, x]。所以我只是添加了 1 个元素,就像第一个列表中的 Head 一样。

标签: prolog successor-arithmetics


【解决方案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([], _, []).

对于第一项具有[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 IDE 吗?我已经配置了 VS Code,但我认为那里可能有更专业的东西。
  • @CosminStoian 在这一点上,IDE 似乎有点矫枉过正。我只是在使用 vim 和 swish.swi-prolog.org 进行练习。
  • 好的。再次感谢您!
  • 请注意,times(A,B,[x]) 不会终止。更好的解决方案可以在标签successor-arithmetics下找到
  • @false:是的,我同意它并非在所有方向都有效。解决此问题的一种快速方法是也迭代第三个参数,以便至少实现终止。
猜你喜欢
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多