我正在尝试编写一个程序,它将两个列表作为输入并检查正确的子集.我开始时:
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2]) :- proper(T1,T2).
Run Code Online (Sandbox Code Playgroud)
这完全适用于完全相同顺序的输入.例如:
?- proper([a,b,c],[a,b,c,d]).
Yes
Run Code Online (Sandbox Code Playgroud)
但不适用于以下输入:
?- proper([a,b,c],[b,d,a,c]).
No
Run Code Online (Sandbox Code Playgroud)
浏览网站后,我发现了之前提出的问题:
这导致我修改我的代码:
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
Run Code Online (Sandbox Code Playgroud)
这适用于子集,但不适用于正确的子集.我认为我的问题来自于我对正确/ 4的第二个句子如何工作的理解.非常感谢任何和所有的帮助.
编辑:
意识到我是试图确定是否第一列表是第二次的真子集和第二个是第一个的子集.清理代码更精确.
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用LISP进行快速排序,但我的功能输出有问题.
(defun qsort (L)
(cond
((null L) nil)
(t(append
(qsort (list< (car L) (cdr L)))
(cons (car L) nil)
(qsort (list>= (car L) (cdr L)))))))
(defun list< (a b)
(cond
(( or(null a)(null b) nil))
(( < a (car b)) (list< a (cdr b)))
(t(cons (car b) (list< a (cdr b))))))
(defun list>= (a b)
(cond
(( or( null a)(null b) nil))
(( >= a (car b)) (list> a (cdr b)))
(t(cons (car b) (list> a (cdr b))))))
Run Code Online (Sandbox Code Playgroud)
我的问题是当list …
(defun solve (L)
(cond
((null L) nil)
(t(eval (list (car (cdr L)) (car L) (car (cdr (cdr L))))))))
Run Code Online (Sandbox Code Playgroud)
我的代码是一个简单的评估程序,只要输入类似于'(5 + 4),它就可以正常工作.但是我希望能够解决其他输入,例如'(5 +(3 - 1))和'(6 + 5) - (4/2).我的问题显然是如何处理括号.我尝试比较'的文字值'(如((等于(汽车L)'()(求解(cdr L))),但这只会抛出我所有的近似括号.有没有办法检查是否有原子是括号?