prolog - 在序言中连接两个具有确定值的列表
问题描述
所以我只是尝试了 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
我认为这里的推送部分是给出错误结果的部分,但也许还有其他部分。任何人都可以指导或帮助我解决这个问题吗?
解决方案
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].```
推荐阅读
- r - 如何修复'错误:位置1的大小(1)不正确,期望'在R中?
- google-chrome - Chrome(和 chromecast)播放在几秒钟后停止
- django - 从 django 模型字段中检索整数并将其添加到字典中,如果它符合条件
- c# - 如何在 Crystal Report 中显示从 mysql 检索为 blob 的图像?
- javascript - Zapier 中的 JavaScript - “IF”语句的不正确行为
- ionic-framework - 无法使用离子载玻片方法(没有 ChangeDetectorRef 提供者)
- php - 在 WooCommerce 商店主页和类别列表中显示 ACF 自定义字段
- java - Kafka Streams DSL 抑制操作似乎不起作用
- jenkins - Jenkins 使用 groovy 脚本添加 Git 行为
- oracle - 我在 Oracle Apex 的“创建页面”对话框中看不到我的插件