首页 > 解决方案 > 在序言中连接两个具有确定值的列表

问题描述

所以我只是尝试了 Prolog,在这里,我想尝试制作我自己的连接函数,它结合了两个列表(第一个列表首先是 X 元素,然后是第二个列表和 Y 元素)。我正在尝试使用递归,但是在我尝试进行一些查询之后,它给出了否定。这是我的代码。

/* These two functions are already correct, I checked it and it cannot be changed anymore */

push(Element,[], Result) :- Result = [Element], !.
push(Element,Queue,Result) :- [Head|Tail] = Queue, push(Element, Tail, Tail2), Result = [Head|Tail2].

pop(Queue,Result) :- [_|Tail] = Queue, Result = Tail.

/* concatenate */
concatenate(_,_,0,0,Result) :- Result = [], !.
concatenate(FList,SList,0,Y,Result) :- pop(SList,B), push(B,Result,Result), [_|Tail] = SList, Z is Y-1, concatenate(FList,Tail,0,Z,Result).
concatenate(FList,SList,X,Y,Result) :- pop(FList,A), push(A,Result,Result), [_|Tail] = FList, Z1 is X-1, concatenate(Tail,SList,Z1,Y,Result).

/* Query */
| ?- concatenate([1,2,3],[2,3,4],1,2,R).
no

我认为这里的推送部分是给出错误结果的部分,但也许还有其他部分。任何人都可以指导或帮助我解决这个问题吗?

标签: prolog

解决方案


pop(Queue,Result) :- [_|Tail] = Queue, Result = Tail.

push(Element,[], Result) :- Result = [Element], !.
push(Element,Queue,Result) :- [Head|Tail] = Queue, push(Element, Tail, Tail2), Result = [Head|Tail2].

concatenate(_,_,0,0,Result) :- Result = [], !.

concatenate(FList,SList,0,Y,Result) :- [Head|Tail] = SList, Z is Y-1, concatenate(FList,Tail,0,Z,Result2), Result = [Head|Result2], !.
concatenate(FList,SList,X,Y,Result) :-  [Head|Tail] = FList, Z1 is X-1, concatenate(Tail,SList,Z1,Y,Result2), Result = [Head|Result2].```

推荐阅读