【问题标题】:Prolog : Comparing numbers in a listProlog:比较列表中的数字
【发布时间】:2015-10-16 18:16:42
【问题描述】:

我有这个数字块:

num(1).
num(-2).
num(5).
num(50).
num(-3).
num(87).

我应该创建一个给定数字的函数,它应该检查该数字是否是上面给出的数字“列表”中最小的。

例如:

not_smallest(5).
true.

not_smallest(X).
X = 1 ;
X = -2 ;
X = 5 ;
X = 50 ;
X = 87.

我的想法是用上面的数字块制作一个列表,并将给定的数字与列表的所有元素进行比较。 但是每当我尝试加载 .pl 文档时,我都会收到此错误:

Syntax error: Operator expected

到目前为止我所做的是:

%increments the index of a List

incr(X, X1) :-
    X1 is X + 1.

%L-list containing "list" of numbers, N - elements of that "list",
I-index , C-number X is going to be compared to, X- number to compare.

 nao_menor(X) :-
    findall(N, num(N), L),
    num(X),
    I is 0,
    nth0(I, L, C),
    X =< C,
    incr(I,I).

【问题讨论】:

  • % 字符指定注释行(不能有换行符),因此您应该在'I-index....' 行的开头添加 % 或将这两行放在一个中
  • 您的nao_menor/1 程序也不会像您预期的那样工作。 (例如incr(I,I) 总是会失败)
  • 我现在刚刚添加了 % 来指定变量是什么,它不在原始代码中,但谢谢你的提醒。
  • 为什么incr(I,I)总是失败?
  • incr(I,I)是什么意思?

标签: list prolog compare comparison


【解决方案1】:

我们开始吧:

not_smallest(N) :-
   num(N),
   \+ \+ (num(M), M < N).

OP 给出的示例查询:

?- not_smallest(5).
true.

?- not_smallest(X).
  X =  1
; X = -2
; X =  5
; X = 50
; X = 87.

【讨论】:

  • 不可能按照我尝试的方式去做吗?
  • @eXistanCe。我不太明白你想用findallnth0 做什么。 findall 不会排序,setof OTOH 会...
  • 这个想法不是对值进行排序,它只是将它们放在一个列表中,因此 findall 然后将任何值与存储在列表中的值进行比较。如果他不小于任何列表元素,则返回 true,如果小于则返回 false
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多