- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想解决一个简单的问题,但即使我尝试了很多不同的方法,我也找不到解决方案。我正在使用 SICStus Prolog (如果这很重要),并且我想获取列表的所有子列表/子集(我不知道哪个术语是正确的),其中包含连续的元素。例如,如果我有列表 [1, 2, 3, 4],则将 sl/2
谓词调用为 sl([1, 2, 3 , 4], R).
,预期结果为:
? - sl([1, 2, 3, 4], R).
R = [] ? ;
R = [1] ? ;
R = [1, 2] ? ;
R = [1, 2, 3] ? ;
R = [1, 2, 3, 4] ? ;
R = [2] ? ;
R = [2, 3] ? ;
R = [2, 3, 4] ? ;
R = [3] ? ;
R = [3, 4] ? ;
R = [4] ? ;
no
到目前为止我能达到的最好结果是:
sl([], []).
sl([X|Xs], [X|Ys]) :-
sl(Xs, Ys).
sl([_|Xs], Ys) :-
sl(Xs, Ys).
但这还给我带来了以下不需要的kết quả:
R = [1,2,4] ? ;
R = [1,3,4] ? ;
R = [1,3] ? ;
R = [1,4] ? ;
R = [2,4] ? ;
我应该如何修改我的谓词才能获得所需的结果?
1 Câu trả lời
在 Prolog 中编写谓词时,您需要考虑谓词的含义,或者它定义的关系。您的谓词给出非解决方案的原因是您在谓词子句中混合了含义。它们的含义并不完全相同。
您有谓词sl/2
,它的意思是“子列表”(或“子序列”),但更重要的是,根据您提供的描述,它是一个< em>连续子列表(其中不能有任何“间隙”)。
现在我们可以分解您的条款:
sl([], []).
这表示空列表是空列表的连续子列表。这是事实,也是有效的事实。
sl([X|Xs], [X|Ys]) :-
sl(Xs, Ys).
这表示如果 Ys
是连续的,则 [X|Ys]
Đúng [X|Xs]
的连续子列表Xs
的子列表。这种关系KHÔNG成立。这里真正正确的是: [X|Ys]
Đúng [X|Xs]
的连续子列表 if Ys
Đúng Xs
的连续前缀子列表。也就是说,Ys
不仅需要是 Xs
的子列表,而且只需要从列表的开头开始,而不是在此列表中的某个位置。这是一个线索,表明您需要另一个谓词,因为关系的含义不同。
您的最后一个子句表示,如果 Ys
Đúng 的子列表,则
。这似乎是真的。Ys
Đúng [_|Xs]
的子列表>Xs
如果我们简单地调整上述更新的定义,我们会得到:
subseq([], []).
subseq([_|Xs], Ys) :-
subseq(Xs, Ys).
subseq([X|Xs], [X|Ys]) :-
prefix_subseq(Xs, Ys).
prefix_subseq(_, []).
prefix_subseq([X|Xs], [X|Ys]) :-
prefix_subseq(Xs, Ys).
我在上面提供了 prefix_subseq/2
定义,但没有解释,但我认为你可以弄清楚。
现在产生:
| ?- subseq([a,b,c,d], R).
R = [a] ? a
R = [a,b]
R = [a,b,c]
R = [a,b,c,d]
R = [b]
R = [b,c]
R = [b,c,d]
R = [c]
R = [c,d]
R = [d]
R = []
(1 ms) yes
定义子列表(或子序列)的一种有趣、紧凑的方法是使用 append/2
谓词:
subseq(L, R) :- append([_, R, _], L).
这表示 L
是附加列表 _
,R
Và _
的结果。这个简单实现的小缺陷是,您将多次获得 R = []
,因为它满足 append([_, R, _], L)
以不止一种方式进行统治。
重新审视定义,您可以使用 DCG 来定义子序列,因为 DCG 非常适合处理序列:
% Empty list is a valid subsequence
subseq([]) --> ... .
% Subsequence is any sequence, followed by sequence we want, followed by any sequence
subseq(S) --> ..., non_empty_seq(S), ... .
% Definition of any sequence
... --> [] | [_], ... .
% non-empty sequence we want to capture
non_empty_seq([X]) --> [X].
non_empty_seq([X|T]) --> [X], non_empty_seq(T).
Bạn có thể sử dụngphrase/2
来调用它:
| ?- phrase(subseq(S), [a,b,c,d]).
S = [] ? ;
S = [a] ? ;
S = [a,b] ? ;
S = [a,b,c] ? ;
S = [a,b,c,d] ? ;
S = [b] ? ;
S = [b,c] ? ;
S = [b,c,d] ? ;
S = [c] ? ;
S = [c,d] ? ;
S = [d] ? ;
no
我们可以稍微重新调整这个定义,并使用通用的 seq//1
定义来使其更加紧凑:
subseq([]) --> seq(_) .
subseq([X|Xs]) --> seq(_), [X], seq(Xs), seq(_).
% alternatively: seq(_), seq([X|Xs]), seq(_).
seq([]) --> [].
seq([X|Xs]) --> [X], seq(Xs).
关于list - 如何在Prolog中获取所有连续的子列表/子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42455589/
Như tiêu đề gợi ý, ans_list là danh sách các câu trả lời và ans_index là một con số (chỉ mục của câu trả lời trong từ vựng, nhưng hiện tại điều đó không liên quan). Tree.anslist được tạo ra ở đây là gì? (ví dụ chỉ dành cho lần đầu tiên), bỏ qua các lần lặp lại. nếu
Hiện tại tôi lưu trữ dữ liệu đầu vào của người dùng trong danh sách phân tách bằng dấu phẩy như thế này: Userid | Tùy chọn 1 | 1,2,5 Người dùng đánh dấu một tập hợp các tùy chọn dưới dạng mảng rồi nối chúng bằng dấu phẩy 1,2,5 rồi đến MySQ
Hiện tại tôi lưu trữ dữ liệu đầu vào của người dùng trong danh sách phân tách bằng dấu phẩy như thế này: Userid | Tùy chọn 1 | 1,2,5 Người dùng đánh dấu một tập hợp các tùy chọn dưới dạng mảng rồi nối chúng bằng dấu phẩy 1,2,5 rồi đến MySQ
Tôi muốn biết cách làm phẳng hoàn toàn các danh sách và những thứ chứa trong đó. Trong số những giải pháp khác, tôi đã nghĩ ra một giải pháp là có thể trượt một vật có nhiều thành phần và đặt chúng lại, hoặc lấy đi một vật có một thành phần sau khi trượt. Điều này tương tự như Làm thế nào để tôi “làm phẳng
Tôi muốn biết cách làm phẳng hoàn toàn các danh sách và những thứ chứa trong đó. Trong số những giải pháp khác, tôi đã nghĩ ra một giải pháp có thể trượt một vật có nhiều thành phần và đặt chúng lại, hoặc lấy đi một vật có một thành phần sau khi trượt ra. Điều này tương tự như Làm thế nào để tôi “làm phẳng
Câu hỏi này đã có câu trả lời: Chuyển đổi danh sách lồng nhau thành mảng 2 chiều (3 câu trả lời) Đã đóng 7 năm trước. Có phím tắt nào để chuyển đổi List
Tôi gặp vấn đề khi sắp xếp một Danh sách>. Tôi đã tạo một trình so sánh tùy chỉnh trong đó tôi viết mã để sắp xếp dữ liệu. lớp công khai CustomComparator triển khai Comparator
Câu hỏi này đã có câu trả lời: Đã đóng cách đây 10 năm. Có thể trùng lặp: Java Generics: Không thể chuyển đổi List thành List? Tôi chỉ muốn biết tại sao mã java sau đây
Đã cố gắng tìm ra cách LINQy để thực hiện việc này nhưng không tìm ra được cách nào. Tôi có một đối tượng List<> chứa một thuộc tính là danh sách các mã chữ cái được phân tách bằng dấu phẩy: lst[0].codes = "AA,BB,DD" lst[1
Giả sử tôi có các phép gán sau: points = [] point = (1, 2) Tôi sẽ làm thế nào: points += point Nó hoạt động tốt và cho tôi points = [1, 2]. Nhưng nếu tôi làm thế này: điểm
Cách chuyển đổi kiểu List[Task[List[Header]]] thành Task[List[Header]] trong scala. Tôi có một phương thức trả về Task[List[Header]] và gọi do nhiều lần
Làm thế nào để tìm các phần tử của danh sách 2D trong Java? Tôi có một hàm lấy List
Gán List này cho List kia hoạt động tốt. Việc gán List> cho List> không biên dịch được. Mã lớp công khai Main { public static void main(String[] a
Tôi đang viết một phương thức trong Java phải nhận và lặp lại một Danh sách Serializable. Sự khác biệt giữa: public void myMethod(List list) { } và public là gì?
Tôi thấy nhiều người muốn cập nhật một phần lưới/danh sách/cây bằng mvvm, nhưng họ không muốn làm mới toàn bộ danh sách. Đối với bất kỳ ai gặp phải vấn đề này, tôi đã đưa ra ví dụ sau. Hy vọng thông tin này hữu ích với bạn. Câu trả lời hay nhất Đây là một ví dụ đơn giản. Điều quan trọng nhất trong toàn bộ mã là:
Tôi đang viết một trình bao bọc cho một thư viện C++ hiện có sử dụng danh sách, trong đó T là một cấu trúc tùy chỉnh. Tôi được gợi ý sử dụng vector thay vì danh sách, nhưng tôi đang cố gắng tránh việc sửa đổi thư viện. Để hiểu rõ hơn về tình huống này, tôi đã tạo một ứng dụng đơn giản sử dụng danh sách
Có sự khác biệt nào giữa hai khai báo này không? Cảm ơn, câu trả lời tốt nhất là có. Danh sách có thể chứa hỗn hợp các thứ khác nhau đều bắt nguồn từ Base. Danh sách chứa các mục đồng nhất (theo nghĩa là tất cả chúng phải
Có ai có thể giải thích sự khác biệt giữa các loại sau đây một cách chi tiết nhất có thể không? Danh sách Danh sách Danh sách Để tôi nói cụ thể hơn nhé. Khi nào tôi muốn sử dụng // 1 public void CanYouGiveMeAnAnswer(List l
Tôi có một danh sách các cặp, mỗi cặp là một cặp danh sách. Vì vậy, dữ liệu của tôi trông như thế này: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
Có thể là một tiêu đề kỳ quặc, nhưng tôi gặp vấn đề sau: với một danh sách kiểu (a * b) list, tôi muốn tạo một danh sách mới kiểu (a * b list) list. Một ví dụ: Cho một danh sách hãy testL
Tôi là một lập trình viên xuất sắc, rất giỏi!