【发布时间】:2020-04-19 19:43:24
【问题描述】:
一个知道 Prolog 一周的人的问题=)
我正在写一些序言命令infix(Inf,List)
检查一个列表是否如我们的教授所说的那样是另一个列表的“中缀”。顺序很重要+它不应该在列表的开头或结尾。
这意味着例如:
如果我们有 Inf=[1,2] 和 List=[1,2,3,4] 那么是假的。
如果我们有 Inf=[3,4] 和 List=[1,2,3,4] 那么 is 也是假的。
如果我们有 Inf=[2,3] 和 List=[1,2,3,4] 那么它是真的。
如果是 Inf=[3,2] 和 List=[1,2,3,4] 那么是假的。
如果是 Inf=[2,4] 和 List=[1,2,3,4,5] 那么是假的。
我已经写了一些规则,用它们我似乎设法解决了顺序问题,而不是计算列表的第一个元素。
infix(Inf,List):- length(Inf,L1),length(List,L2), L1>L2, !, fail.
infix(Inf,List):- length(Inf,L1),length(List,L2), L1=L2, !, fail.
infix(Inf,List):- length(Inf,L1),length(List,L2), L1<L2, delete_first(Inf,List).
delete_first(Inf,[_L|List]):- sublist(Inf,List).
sublist([El|Sub],[El|List]):- checksublist(Sub,List).
sublist([S|Sub],[L|List]):- sublist([S|Sub],List).
checksublist([], L).
checksublist([El|Sub],[El|List]):- checksublist(Sub,List).
但是,我无法以某种方式制定它,因此最后一个元素不计入=(。根据我的直觉逻辑,条件checksublist([], L).应该像checksublist([], [_|[]]).一样,但这不起作用方式-我什么都错了。
有人知道在这种情况下如何摆脱最后一个元素吗?提前致谢!
【问题讨论】:
标签: prolog