天道酬勤,学无止境

Prolog 列表未在控制台上打印所有元素(Prolog list not printing all the elements on console)

问题

我正在使用 SWI-PROLOG 版本 6.6.6

我想打印特定谓词类型的所有属性。

我有一个名为 law 的谓词,其数量为 2。

一些事实是

law(borrow,'To borrow Money on the credit of the United States').
law(commerce,'To regulate Commerce with foreign Nations, and among the several States, and with the Indian Tribes').
law(unifomity,'To establish an uniform Rule of Naturalization, and uniform Laws on the subject of Bankruptcies throughout the United States').
law(money,'To coin Money, regulate the Value thereof, and of foreign Coin, and fix the Standard of Weights and Measures').
law(punishment,'To provide for the Punishment of counterfeiting the Securities and current Coin of the United States').
law(establishment,'To establish Post Offices and post Roads').
law(exclusiverights,'To promote the Progress of Science and useful Arts, by securing for limited Times to Authors and Inventors the exclusive Right to their respective Writings and Discoveries').
law(court,'To constitute Tribunals inferior to the supreme Court').

等等。

现在我想通过输入它的类型来访问法律。 如,

power(X) :- law(X,Y), display('\nCongress has the power : '),display(Y).
powers(ALL) :- display('\nCongress has the powers : '), law(_,Y), display('\n'), display(Y).

这完美地工作。 现在,我也希望用户知道所有类型的法律是什么,以便用户可以将其作为查询输入以获取相应的法律。 前power(money).

为此,我进行了查询以获取所有这些关键字并将它们添加到列表中并显示该列表。 但最终打印出来的列表并不完整。

powerList(L) :- findall(X,law(X,_), L).

我使用此代码来获取列表。 但是控制台上的输出是

L = [borrow, commerce, unifomity, money, punishment, establishment, exclusiverights, court, piracyfelony|...].

但是,即使在盗版重罪之后,还有更多的法律类型,并且它们没有被打印到控制台。 我如何打印它们?

回答1

这是 Prolog 顶级循环的一个特性,它试图保持输出简短。

要了解如何更改它,请询问您的 Prolog 支持哪些 Prolog 标志,其值为至少包含两个元素的列表:

?- current_prolog_flag(F,Options), Options = [_,_|_].
F = debugger_print_options,
Options = [quoted(true), portray(true), max_depth(10), attributes(portray), spacing(next_argument)] ;
F = toplevel_print_options,
Options = [quoted(true), portray(true), max_depth(10), spacing(next_argument)] ;
F = argv,
Options = [swipl, '-f', none] ;
false.

现在相应地修改它:

?- length(L,10).
L = [_G303, _G306, _G309, _G312, _G315, _G318, _G321, _G324, _G327|...].

?- set_prolog_flag(toplevel_print_options,[quoted(true), portray(true), max_depth(0), spacing(next_argument)]).
true.

?- length(L,10).
L = [_G303, _G306, _G309, _G312, _G315, _G318, _G321, _G324, _G327, _G330].

(在从 SWI 7 开始的较新版本中,还有另一个标志值answer_write_options 。)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 prolog 再添加两次(Add two more occurrences using prolog)
    问题 我有一个列表[a, b, a, a, a, c, c]并且我需要为每个元素添加两次。 最终结果应如下所示: [a, a, a, b, b, b, a, a, a, a, a, c, c, c, c] 如果我在列表中有一个与下一个项目相同的项目,那么它会一直运行直到有一个新项目,当它找到新项目时,它会添加前一个项目的两次出现,然后继续前进。 到目前为止,这是我的代码,但我不知道如何添加两个... dbl([], []). dbl([X], [X,X]). dbl([H|T], [H,H|T], [H,H|R]) :- dbl(T, R). 回答1 您的代码看起来有点奇怪,因为最后一条规则需要三个参数。 你只调用二进制版本,所以没有递归会尝试派生它。 您已经有一个好主意,可以查看列表中元素发生变化的部分。 所以有4种情况: 1) 您的列表是空的。 2)你只有一个元素。 3) 您的列表以两个相等的元素开始。 4) 您的列表以两个不同的元素开始。 未指定情况 1,因此您可能需要为此找到一个明智的选择。 案例 2 与案例 4 有点相似,因为列表的末尾可以被视为元素的变化,您需要附加两个副本,但您已经完成了。 情况 3 很简单,我们可以只保留元素并递归其余元素。 第 4 种情况是您需要再次插入两个副本。 这意味着您的代码将如下所示: % Case 1 dbl([],[]). % Case
  • prolog:列表中最大重复的元素(prolog: maximally repeated element in a list)
    问题 如何检索列表中重复次数最多的元素的任何想法。 即像下面这样的东西, ?- maxRepeated([1,2,7,3,6,1,2,2,3],M). M = 2. 回答1 此解决方案对列表进行排序,允许元素按顺序出现——一旦它们以后不再重复,就无需维护所有元素。 您的 prolog 解释器必须具有函数msort() ,它对维护重复条目的列表进行排序。 maxRepeated([], []). maxRepeated(L, E) :- msort(L, [H|T]), maxRepeated(T, H, H, 1, 0, E). maxRepeated([], H, _, C1, C2, H) :- C1 >= C2. maxRepeated([], _, X, C1, C2, X) :- C1 < C2. maxRepeated([H|T], H, LastF, C1, C2, E) :- maxRepeated(T, H, LastF, C1 + 1, C2, E). maxRepeated([X|T], H, LastF, C1, C2, E) :- ( C1 > C2 -> maxRepeated(T, X, H, 1, C1, E) ; maxRepeated(T, X, LastF, 1, C2, E) ). 复杂度由所使用的排序给出,通常为O(n log n) ,一次
  • 检查列表中的所有数字在序言中是否都不同(Check if all numbers in a list are different in prolog)
    问题 我想在序言中创建一个规则,以检查列表中是否有重复的数字。 例如: 对于[1,2,3,4] ,它将返回true 。 对于[1,2,3,3] ,由于重复3 ,它将返回false 我想出了这条规则,但是没有用 Different([]). Different([H|T]):- Member(H,T), Different(T). 有任何想法吗? 回答1 一个紧凑的定义可能是 all_diff(L) :- \+ (select(X,L,R), memberchk(X,R)). 也就是说,如果我们不能窥视一个元素,然后在其余元素中找到它,那么所有元素都是不同的... 编辑 让我们(略微)提高效率:检查X是否是前缀子列表的成员是没有用的,所以: all_diff(L) :- \+ (append(_,[X|R],L), memberchk(X,R)). 回答2 检查所有列表成员是否唯一的最简单方法是对列表进行排序,并检查排序后的列表的长度等于原始列表的长度。 different(X) :- sort(X, Sorted), length(X, OriginalLength), length(Sorted, SortedLength), OriginalLength == SortedLength. 您的解决方案由于语法错误(事实和谓词不应以大写字母开头)和逻辑错误而无法正常工作。
  • 一个无限的列表是理智的吗?(Is an infinite list of ones sane?)
    问题 在 Prolog 中,统一X = [1|X]是获得无限列表的明智方法吗? SWI-Prolog 没有任何问题,但 GNU Prolog 只是挂起。 我知道在大多数情况下我可以用 one(1). one(X) :- one(X). 但我的问题是明确的,是否可以在“理智的”Prolog 实现中使用表达式X = [1|X], member(Y, X), Y = 1 。 回答1 在 Prolog 中,统一X = [1|X]是获得无限列表的明智方法吗? 这取决于您是否认为生成无限列表是明智的。 在 ISO-Prolog 中,像X = [1|X]这样的统一会受到发生检查 (STO) 的影响,因此是未定义的。 也就是说,符合标准的程序不得执行这样的目标。 为了避免这种情况发生,有unify_with_occurs_check/2 , unify_with_occurs_check/2 subsumes_term/2 。 为了防止接口接收无限项,有acyclic_term/1 。 所有当前的实现都终止于X = [1|X] 。 GNU Prolog 也终止: | ?- X = [1|X], acyclic_term(X). no 但是对于更复杂的情况,需要合理的树统一。 将此与 Haskell 进行比较,其中repeat 1 == repeat 1导致ghci冻结。 至于在常规 Prolog
  • SWI-Prolog如何显示完整答案(列表)?(SWI-Prolog how to show entire answer (list)?)
    问题 我正在尝试将字符串转换为ascii代码列表,如下所示: 7 ?- string_to_list("I'm a big blue banana in space!", C). C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...]. 8 ?- 正如您所看到的,这并没有给我完整的列表,但我需要它。 该解决方案不起作用:我无法按w,因为它会给我答案,并且会停下来。 这样做也不是:我可以调用该函数,它返回true,但是列表仍未完全显示。 11 ?- set_prolog_flag(toplevel_print_options,[quoted(true), portray(true), max_depth(0), spacing(next_argument)]). true. 12 ?- string_to_list("I'm a big blue banana in space!", C). C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...]. 13 ?- 任何帮助表示赞赏! 回答1 ?- set_prolog_flag(answer_write_options,[max_depth(0)]). true. ?- string_to_list("I'm a big blue banana in
  • 如何在Prolog中将两个列表的所有元素彼此相乘(How to multiply all elements of two lists with each other in Prolog)
    问题 我正在考虑如何将两个列表的所有元素彼此相乘。 然后我想把所有的结果都放在List3 。 例如, List1 = [1,3,5]. List2 = [2,6,7]. List3应包含[1x2、1x6、1x7、3x2、3x6、3x7、5x2、5x6、5x7]。 到底; List3 = [2, 6, 7, 6, 18, 21, 10, 30, 35]. 有可能这样做吗? 怎么做? 我找不到正确的方法。 回答1 好吧,首先来看一下swi-prolog中每个列表元素和其他元素的执行操作问题,以了解如何对lists执行for-each操作。 第二,这是代码: prod(X,[],[]). prod(X,[HEAD|TAIL],L) :- prod(X,TAIL,L1), W is X * HEAD, L = [W|L1]. prod2([],Y,[]). prod2([HEAD|TAIL],Y,L) :- prod(HEAD,Y,L1), prod2(TAIL,Y,L2), append(L1,L2,L). 输出: ?- prod2([1,3,5] ,[2,6,7],G). G = [2, 6, 7, 6, 18, 21, 10, 30, 35] . 回答2 这是一个使用library(lambda)简单解决方案 product(Xs, Ys, Ps) :- maplist(Ys+\X
  • 如何在 SWI-Prolog 中扩展结果列表?(How to expand a resulting list in SWI-Prolog?)
    问题 ?- length(L,25). L = [_G245, _G248, _G251, _G254, _G257, _G260, _G263, _G266, _G 269|...]. 如果我在长度谓词之后使用 write(L) ,那么解释器会打印列表两次,一次扩展,另一个不打印。 回答1 深度有限制,防止输出过长。 您可以使用 set_prolog_flag/1 更改它。 ?- length(L, 25). L = [_G257, _G260, _G263, _G266, _G269, _G272, _G275, _G278, _G281|...]. ?- current_prolog_flag(toplevel_print_options, V). V = [quoted(true), portray(true), max_depth(10), priority(699)]. ?- set_prolog_flag(toplevel_print_options, [quoted(true), portray(true), max_depth(100), priority(699)]). true. ?- length(L, 25). L = [_G257, _G260, _G263, _G266, _G269, _G272, _G275, _G278, _G281, _G284
  • Prolog 搜索从列表中减去 2 个元素的可能组合(Prolog search for possible combination for subtracting 2 elements from a list)
    问题 这是此页面的扩展问题。 Prolog 可能删除列表中的元素 例如,对于列表 X = [1,2,3],我可以减去如下: 从第 1 个/第 2 个元素中减去 1,X 变为 [1-1, 2-1, 3] = [0, 1, 3] = [1, 3] 从第 1 个 / 第 3 个元素中减去 1:X 变为 [2, 2] 从第二个/第三个元素中减去 1:X 变为 [1, 1, 2] 从第二个/第三个元素中减去 2:X 变为 [1, 1] 因此,它总是减去 2 个元素,并且具有相同的数字,但始终是实数。 有没有人对此有任何想法? 这看起来更好: subt_comb(X, Y). X = [1,2,3] Y = [1,3] Y = [2,2] Y = [1,1,2] Y = [1,1] 在查看了 lurker 和 gusbro 的解决方案后,我创建了这样的东西。 remove2([HX|T], S2):- between(1, HX, Y), remove2__([HX|T], Y, S2). remove2([HX|T], [HX|TY]):- remove2(T, TY). % remove2__(S1, Y, S2), this procedure is to execute 0 after % subtraction. Y is generated from remove2(S1, S2)
  • 将谓词应用于列表元素的Prolog映射过程(Prolog map procedure that applies predicate to list elements)
    问题 如何编写将谓词PredName(Arg, Res)应用于List的元素并在Result列表中返回结果的Prolog过程map(List, PredName, Result) ? 例如: test(N,R) :- R is N*N. ?- map([3,5,-2], test, L). L = [9,25,4] ; no 回答1 这通常称为maplist/3 ,是Prolog序言的一部分。 注意不同的参数顺序! :- meta_predicate maplist(2, ?, ?). maplist(_C_2, [], []). maplist( C_2, [X|Xs], [Y|Ys]) :- call(C_2, X, Y), maplist( C_2, Xs, Ys). 不同的参数顺序允许您轻松地嵌套多个maplist -goals。 ?- maplist(maplist(test),[[1,2],[3,4]],Rss). Rss = [[1,4],[9,16]]. maplist有不同arities并对应于函数式语言以下构造,但要求所有的名单是相同的长度。 请注意,Prolog在zip / zipWith和unzip之间没有不对称性。 一个目标maplist(C_3, Xs, Ys, Zs)包含在内,甚至提供了更多通用用途。 maplist/2对应all maplist
  • Prolog - 带有文件输入的 DCG 解析器(Prolog - DCG parser with input from file)
    问题 作为项目的一部分,我需要编写一个解析器,它可以读取文件并将其解析为可以在我的程序中使用的事实。 文件结构如下所示: property = { el1 , el2 , ... }. 我最终想要的是: property(el1). property(el2). ... 我这样阅读我的文件: main :- open('myFile.txt', read, Str), read_file(Str,Lines), close(Str), write(Lines), nl. read_file(Stream,[]) :- at_end_of_stream(Stream). read_file(Stream,[X|L]) :- \+ at_end_of_stream(Stream), read(Stream,X), parse(X), % Here I call upon my parser. read_file(Stream,L). 现在我已经阅读了几本关于 DCG 的书籍和网上,但它们都解释了相同的简单示例,您可以在其中生成诸如“猫吃蝙蝠”之类的句子...... . 我所做的是“解析”下面的一行: property = el1. 至 property(el1). 有了这个: parse(X) :- X =.. List, % Reason I do this is because X
  • Prolog 可能删除列表中的元素(Prolog possible removal of elements in a list)
    问题 我被要求尝试搜索所有可能的结果,从列表中的任何单个元素中删除任何数字。 例如,如果我有一个列表 X = [1,2,3] remove(X, Y) 我的结果将是: Y = [2,3] Y = [1,1,3] Y = [1,3] Y = [1,2,2] Y = [1,2,1] Y = [1,2] 为此,我已经编写了 2 个解决方案,但我真的不知道我的解决方案的缺点是什么。 我的教授一直告诉我有更好的方法来做到这一点。 我的第一种方法: test(S1, S2):- length(S1, L), M is L -1, between(0, M, N), remove(S1, S2, N). remove([H|T], [H2|T2], Heap):- ( Heap>0-> H2 = H, remove(T, T2, Heap-1); between(1, H, N), H2 is H - N, T2 = T ). 我的第二种方法: remove1([H|T], [H|TY]):- not(T=[]), remove1(T, TY). remove1([H|T], S2):- between(1, H, X), HY is H - X, ( HY = 0-> S2 = T; S2=[HY|T]). 这两种方法都给出了相同的结果,但我真的很想知道我怎样才能做得更好。
  • prolog,在元组列表中查找列表元素(prolog, find list elements in a list of tuples)
    问题 我正在尝试用 Prolog 解决一个新程序,但我被卡住了,不知道如何继续......我必须做一个有 3 个参数的谓词,第一个是元素列表,第二个是是元组列表,如果元组的第一个元素与第一个参数列表的元素匹配,则第三个必须是返回的包含元组第二个元素的列表。 它也必须删除副本!! 例如, check([a,c],[(a,aa),(bb,bbb),(a,aa),(c,def)],X). X = [aa, def] . 如您所见, a 和 c 匹配元组列表,因此返回元组的第二个元素。 所以它有效,但是如果有多个元组包含第一个列表中匹配的第一个元素,它只需要一次,例如: check([a,b],[(a,c),(a,d),(b,c),(b,e),(c,f)],X). X = [c] . 它第一次找到a并取c,第一次找到b并再次取c,但不会迭代找到更多的a或b,正确的结果应该是X=[c,d,e]。 所以,我请你帮忙解决这种情况或解决它的任何线索...... 这是我的代码: check([],_,[]). check(L,DIC,Xord) :- inter(L,DIC,X), list_to_set(X,Xord). inter([],_,[]). inter(L1, DIC, L3) :- L1 = [H|T], DIC = [(DIC1,DIC2)|_], H == DIC1, L3 =
  • 如何计算列表中的所有偶数(How to count all even numbers in a list)
    问题 请帮助我如何计算 Prolog 列表中的偶数。 我是初学者,昨天刚开始学习 Prolog。 我知道计算列表中的元素是 mylen([H|Lc],N) :- mylen(Lc,M),N is M+1. mylen([],0). 我认为在这种情况下定义偶数可能会有所帮助,我想代码可能类似于: even(n):- N rem 2 =:= 0. 你能帮我把这两部分放在一起,让我的代码计算偶数吗? 我知道我还需要添加一个计数器,但我不知道如何在 Prolog 中执行此操作。 非常感谢您的帮助! 回答1 目前,您有两个规则: (1)空列表的元素个数为0 my_len([], 0). (2)元素的列表中的编号[H|Lc]是N如果列表中的元素的数量Lc是M和N是M+1 my_len([H|Lc], N) :- my_len(Lc, M), N is M+1. 您已经掌握了一个谓词,如果数字为偶数则为真,否则为假: N是偶数,如果N除以2的余数为0 : even(N) :- N rem 2 =:= 0. 现在你可以把它拼凑起来。 空列表中偶数元素的数量仍然为零。 所以你遵守规则(1)。 您的规则 (2) 需要更改,因为它需要检查列表的头部是否为偶数。 您可以使用 Prolog 中的两个规则来完成此操作,它们处理两种不同的情况(列表头为偶数,或列表头为奇数): (2a)中,即使元件在列表中的编号
  • 强制变量重新分配(Prolog)(Forcing variable to reassign (Prolog))
    问题 作业是接收两个变量,一个介于 0 和 10,000 之间的数字以及一个表示 1 和该数字之间有多少个圆形素数的数字。 我在通过递归传递变量时遇到了麻烦(我认为回溯就是它的名字。)我得到了正确的数字,而且我很确定我已经理解了这个概念,我遇到的问题是它抛出了一个尝试重新分配变量时出错(?!) 这是代码: circPrimeCompare(Below, NumCirc):- RealNum is 0, circPrimeCompare(1, Below, RealNum, []), print('R: '), print(RealNum), nl, (NumCirc =:= RealNum). circPrimeCompare(_, 0, _, _). circPrimeCompare(N, 1, _, _):- prime(N), print('aaa'). circPrimeCompare(X, Below, RealNum, L):- ( prime(X), X<Below -> print(X), nl, numDigits(X, Y), rotate(X, Y, N2), ( prime(N2) -> RealNum2 is RealNum + 1 ; RealNum2 is RealNum ), X2 is X + 1, ( not(circPrimeCompare
  • 在列表中计数。 帮我理解这段代码(Counting within a list. Help me understand this code)
    问题 我发现了一个 3 年前的问题,它可以帮助我计算列表中变量出现的次数。 这个问题在下面有答案。 该代码有效。 但我无法理解如何,有人可以帮我理解这一点吗? 这是我找到的代码的答案,用引号引起来是答案的一部分: count([],X,0). count([X|T],X,Y):- count(T,X,Z), Y is 1+Z. count([X1|T],X,Z):- X1\=X,count(T,X,Z). '但是请注意,第二个参数 X 应该被实例化。 因此,例如 count([2,23,3,45,23,44,-20],23,C) 会将 C 与 2 统一。如果您想要每个元素的计数,请使用' :- use_module(library(lists)). count([],X,0). count([X|T],X,Y):- count(T,X,Z), Y is 1+Z. count([X1|T],X,Z):- X1\=X,count(T,X,Z) countall(List,X,C) :- sort(List,List1), member(X,List1), count(List,X,C). '然后你得到' ?- countall([2,23,3,45,23,44,-20],X,Y). X = -20, Y = 1 ; X = 2, Y = 1 ; X = 3, Y = 1 ; X =
  • Prolog 联合失败(Prolog union fails)
    问题 我试图了解在 Prolog 中使用 union(内置谓词)。 在许多情况下,它似乎在应该成功的时候失败了。 这似乎与列表元素的顺序有关。 以下所有情况都失败了(它们返回“false”。)。 ?- union([1,2,3],[],[2,3,1]). ?- union([1,5,3], [1,2], [1,5,3,2]). ?- union([4,6,2,1], [2], [1,2,4,6]). ?- union([1,2], [], [2,1]). 所有这些不应该是真的吗? 关于为什么这些案例不断失败的任何解释都会非常有帮助。 另外:为什么下面没有成功并找到 A 的正确列表? ?- union([1,5,3], A, [4,1,5,3,2]). /** comes back with "fail." */ 回答1 这里有几个问题。 声明性和程序性的。 让我们从声明性的开始,他们真的坐得更深一些。 程序方面可以使用适当的编程技术轻松处理,如本答案所示。 当我们考虑谓词的声明性属性时,我们会考虑它的解决方案集。 所以我们假装我们只关心谓词将描述什么解决方案。 我们将完全忽略所有这些是如何实现的。 对于非常简单的谓词,这是一个简单的事实枚举——就像一个数据库表。 在这种情况下,这一切都是显而易见的。 如果解决方案集是无限的,这将变得更加不直观。 这很容易发生。 想想查询 ?-
  • 如何从Prolog列表中删除最后一个元素?(How to delete the last element from a list in Prolog?)
    问题 我处于以下情况:我有一个列表,我只想删除最后一个元素。 我已经执行了以下规则(效果不佳): deleteLastElement([Only],WithoutLast) :- !, delete([Only],Only,WithoutLast). deleteLastElement([_|Tail],WithoutLast) :- !, deleteLastElement(Tail,WithoutLast). 问题是,当我调用它时,列表中的所有元素都会被删除,实际上,如果执行以下语句,我将获得: [debug] ?- deleteLastElement([a,b,c], List). List = []. 查看痕迹,我认为这很清楚是导致此问题的原因: [trace] ?- deleteLastElement([a,b], List). Call: (7) deleteLastElement([a, b], _G396) ? creep Call: (8) deleteLastElement([b], _G396) ? creep Call: (9) lists:delete([b], b, _G396) ? creep Exit: (9) lists:delete([b], b, []) ? creep Exit: (8) deleteLastElement([b], [])
  • Prolog仅删除唯一元素(Prolog removing unique elements only)
    问题 我想返回一个列表,例如删除所有唯一元素的列表 remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q). Q = [1,1,2,2,4,4,6,6,6]. 我的问题是目前我有返回的代码 remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q). Q = [1, 2, 4, 6, 6]. 这样就只返回这些非唯一值的第一个实例。 这是我的代码: remUniqueVals([], []). remUniqueVals([Q1|RestQ],[Q1|Xs]) :- member(Q1,RestQ), remUniqueVals(RestQ,Xs). remUniqueVals([Q1|RestQ],Xs) :- remove(Q1,[Q1|RestQ], NewQ), remUniqueVals(NewQ,Xs). 我可以看到member(Q1,RestQ)在第二次检查1,2,4时失败,因为它们现在不再在列表中,因此将其删除。 我想帮助解决这个问题,我的想法是检查member(Q1, PreviousQ) ,这是最后一个Q已经存在的元素。 不确定如何实施,尽管会有所帮助。 更新: 好的,谢谢您提出的建议,最后我最终提出了以下建议: remUniqueVals(_,[], []). remUniqueVals(_,[Q1|RestQ]
  • 如何在prolog中找到列表中的差异并确定列表是否相同(相同的元素但不必具有相同的顺序)(How to find differences in lists in prolog and determine if the lists are the same (same elements but doesnt have to have the same order))
    问题 如果我有两个列表,说 A 和 B 由不同的字母组成。 列表 A 中的 [b,a,c] 和列表 B 中的 [b,d,c,e] 我怎样才能让序言给我 C,这是 A 具有但未包含在列表 B 中的元素列表 Ex . 所以如果我输入difference([b,a,c],[b,d,c,e],C). 我希望答案为: C=[a] 如果我有两个列表,其中列表 A 由 [a,b,c] 组成,列表 B 是 [c,a,b] 我希望结果为Yes如果我输入: same([a,b,c],[c,a,b]). 因为它们包含相同的元素,所以它们的顺序不同并不重要。 此外,如果所有元素都相同,它应该只回答是,而不是 3/4 是正确的。 回答1 由于这看起来像家庭作业,我只会给出一些想法,而不是实际代码: 首先,您可以从确定元素是否为列表成员的成员过程开始: member(X, [X|_]). member(X, [_|T]) :- member(X, T). 所以 X 要么是列表的头部,要么是尾部的成员。 然后你的第一个问题可以回答为: 1. If list A is empty then list C is empty 2. The head of A (HA) is the head of C if member(HA, B) is false AND the Tail of C (CT) can be
  • 序言中的列表长度(List Length in Prolog)
    问题 我是Prolog编程的初学者。 我写了这个程序来计算列表的长度。 为什么程序下方错误? length(0, []). length(L+l, H|T) :- length(L, T). 我写了下面的程序,它可以正常工作。 length([], 0). length([H|T], N) :- length(T, N1), N is N1+1. 当我更改订单时,出现错误。 为什么? length([], 0). length([H|T], N) :- N is N1+1, length(T, N1). 回答1 您需要使用一个累加器。 虽然您可以执行以下操作: list_length([] , 0 ). list_length([_|Xs] , L ) :- list_length(Xs,N) , L is N+1 . 它将一直递归到列表的末尾,然后在每次调用返回时,在长度上增加一个,直到返回到具有正确结果的顶级为止。 这种方法的问题是每次递归都会在堆栈上推送一个新的堆栈框架。 这意味着给定足够长的列表,您将[最终]用完堆栈空间。 而是使用尾递归中介,如下所示: list_length(Xs,L) :- list_length(Xs,0,L) . list_length( [] , L , L ) . list_length( [_|Xs] , T , L ) :- T1 is T