prolog - 获取子句的其余部分作为列表并创建列表列表

标签 prolog

假设我有一些子句,其中两个如下:

has_basket('Sarah', 'bigBasket','apple','grape').
has_basket('Sarah', 'bigBasket','orange','berry').

如何写一个名为

的规则
all_baskets(S,L).

哪个会给我以下表格中的人 S 拥有的所有篮子的列表? 例如

all_baskets('Sarah',L).

会给我们:

L=[['bigBasket','apple','grape], ['bigBasket','orange','berry']]

最佳答案

每当您考虑 Prolog 编程问题时,您都需要阐明对您来说重要的方面。

  1. 考虑列表中两个元素的顺序。它们的顺序是因为它们按字母升序排列,还是只是运气?

  2. 您对 all_baskets('Nemo', L) 有什么期望?这应该失败,还是回答 L = []

  3. 您对 all_baskets(P, []) 有什么期望?

如果你说 1 个字母顺序,2 个失败,3 个失败,那么 setof/3 就是要走的路。

has_basket('Sarah',  bigBasket, apple, grape).
has_basket('Sarah',  bigBasket, orange, berry).
has_basket('Bernie', bigBasket, orange, apple).  % another fact

all_baskets(P, L) :-
   setof([A, B, C], has_basket(P, A, B, C), L).

?- all_baskets(P, []).
   false.
?- all_baskets('Nemo', L).
   false.
?- all_baskets(P, L).
   P = 'Bernie', L = [[bigBasket,orange,apple]]
;  P = 'Sarah', L = [[bigBasket,apple,grape],[bigBasket,orange,berry]].

关于prolog - 获取子句的其余部分作为列表并创建列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58261044/

相关文章:

序言: avoid redundant choice points (non-determinism) with and without cut operator

c - 如何从源代码编译picoProlog?

prolog - 写入文件 | Swi-Prolog | window

testing - 测试序言程序的更快方法

if-statement - Prolog 中正确的流程控制,无需使用非声明式 if-then-else 语法

prolog 规则作为参数

Prolog:毕达哥拉斯三元组

syntax - 我们可以将 X/Y 或 X :Y in Prolog 归入什么类别

prolog - "Not"在 Prolog 中如何工作?

java - 在 tuProlog 中执行查询时出错