标签: difference-lists

首先从LISP中的列表中排序原子然后再列出子列表

我在LISP中有这个功课,我需要从列表中挑选出原子然后的子列表.我确信这应该是一件容易的事,但由于我不是一个程序员,所以这真的花了很长时间让我理解.

我有这个数字列表:

(5 -1 (2 6 1) (8 7 -3) (0 (9 4)) -6)
Run Code Online (Sandbox Code Playgroud)

如果我理解我的任务,那么我应该得到这样的东西:

(5 -1 -6 (2 6 1) (8 7 -3) (0 (9 4)))
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的是如何计算原子和/或子列表,但我不需要.

(DEFUN ATOMNUMBER (L) (COND ((NULL L) 0)
  ((ATOM (CAR L)) (+ 1 (ATOMNUMBER (CDR L))))
  (T (ATOMNUMBER (CDR L))) ))
Run Code Online (Sandbox Code Playgroud)

即使只有子列表,只有原子或只是空列表,该函数也应该正常工作.

也许有人可以给我任何例子?

提前致谢!

lisp common-lisp difference-lists

3
推荐指数
1
解决办法
1126
查看次数

回文(家庭作业)

我尝试使用列表编写Prolog程序.但是,我必须使用差异列表,输出应该是:

列表的第i 元素与列表的第(n-i + 1)元素相同,n是列表的长度.例如,[a,X,c,b,Y]应该给X = bY = a.我在其他问题中找不到类似的回文示例.

到目前为止,我已实施:

% length of the list 
len([], 0).
len([H|T], B) :-
   len(T, NT),
   B is NT + 1.

% return the ith element of the list 
match([H|_], 0, H) :-
   !.
match([_|T], N, H) :-
   N > 0,
   N1 is N-1,
   match(T, N1, H).
Run Code Online (Sandbox Code Playgroud)

但是,我无法完成.请帮我!

list prolog palindrome dcg difference-lists

3
推荐指数
1
解决办法
471
查看次数

是否可以在Prolog中将空列表写为差异列表?

对于像我这样的Prolog初学者来说空列表是......很奇怪.我会说,不可能将空列表写[]为差异列表T1-T2,因为不可能将原子写为差异列表.但是,我猜想要使用递归,必须有一种方法可以[]在差异列表设置中使用.我已经谷歌了,但我找不到答案,Bratko(人工智能的Prolog编程)只是简单地触及了这个主题.

那么,是否可以在Prolog中将空列表作为差异列表编写,如果是这样,它将如何以及何时有用?

list prolog empty-list difference-lists

3
推荐指数
1
解决办法
271
查看次数

Prolog子列表关系

我正在阅读Ivan Bratko的人工智能Prolog编程书籍,之前我没有使用过Prolog的经验.在书中,列表的子列表关系表示为:

S is a sublist of L if:
1) L can be decomposed into two lists, L1 and L2, and
2) L2 can be decomposed into two lists, S and some L3.
Run Code Online (Sandbox Code Playgroud)

关系如下:

sublist(S, L) :-
    conc(L1, L2, L),
    conc(S, L3, L2).

conc([], L, L).
conc([X|L1], L2, [X|L3]) :-
    conc(L1, L2, L3).
Run Code Online (Sandbox Code Playgroud)

对我来说,为什么我们不只是将列表分解为两个列表并检查其中一个列表是否与S匹配,这似乎很奇怪?

list prolog sublist difference-lists

3
推荐指数
2
解决办法
361
查看次数

我想出了在列表中测试等于a和b的代码,但无法理解底层的递归

s(A,A).
s(A,D):- l(A,B),s(B,C),r(C,D).

l([a|A],A).

r([b|A],A).
Run Code Online (Sandbox Code Playgroud)

prolog中的上述代码检查列表的给定输入是否等于a和b.

s([a,a,b,b],[]).
True.
Run Code Online (Sandbox Code Playgroud)

这涉及递归和差异列表.任何人都可以解释底层递归检查如何与b的步骤相等.

list prolog difference-lists

2
推荐指数
1
解决办法
101
查看次数

如何在Prolog解释器中使用差异列表

当我把这个问题在一个空列表上作为差异列表时,我想测试我对这些结构的了解.然而,当我尝试一些简单的事情,比如比较不同的符号时,似乎我错了,而且我明白差异列表实际发生了什么.

?- L = [a,b,c|[d,e]]-[d,e], L = [a,b,c].
false % expected true
Run Code Online (Sandbox Code Playgroud)

我在SWI-Prolog和SICStus上测试了这个.我验证了符号,因为它是如何在Bratko的人工智能Prolog编程中编写的,第210页,但显然统一是不可能的.这是为什么?这些符号不具有相同的声明含义吗?

prolog difference-lists

1
推荐指数
1
解决办法
350
查看次数