首页 > 解决方案 > 在 Prolog 中附加对列表元素的操作结果

问题描述

我现在在这个问题上停留了一段时间。

假设我有一些这样的事实:

function([1,2,3],['A']).
function([4,5,6],['B']).

我想写一个这样的谓词:

mapSomeList(List,Result)

例如,它可以将列表[[1,2,3],[4,5,6],[1,2,3]]转换为['A','B','A']

如何使用递归来实现mapSomeList

我试过的:

mapSomeList([],[]).
mapSomeList([X|Rest],Result):-
    function(X,Letter),
    append(Letter,[X],Result),
    mapSomeList(X,Rest).

但它只是不会返回Result.

谢谢!

标签: prolog

解决方案


解决这个问题的两种简单方法:一种有append/3,一种没有。

解决方案 1 append/3

mapSomeList([],L,L).
mapSomeList([H|T],LT,LO):-
    function(H,F),
    append(LT,F,LT1),
    mapSomeList(T,LT1,LO).

mapSomeList(List,Result):-
    mapSomeList(List,[],Result).

?- mapSomeList([[1,2,3],[4,5,6],[1,2,3]],L).
L = [['A'], ['B'], ['A']]

解决方案 2 没有append/3

mapSomeList([],[]).
find_pair([H|T],[F|T1]):-
    function(H,F),
    mapSomeList(T,T1).

?- mapSomeList([[1,2,3],[4,5,6],[1,2,3]],L). 
L = [['A'], ['B'], ['A']]

差异?尝试在内部运行两个目标time/1(我使用了 SWISH)

?- time(find_pair([[1,2,3],[4,5,6],[1,2,3]],L)).

append/314 inferences, 0.000 CPU in 0.000 seconds (92% CPU, 378757 Lips)

没有append/36 inferences, 0.000 CPU in 0.000 seconds (79% CPU, 377169 Lips)

因此,您已经从这个简单的示例中可以看出,没有附加的解决方案更快。


推荐阅读