0

我正在尝试编写一个规则来比较两个原子以查看哪个更好例如(memory_with_gb_2 比 memory_with_gb_1 更好),我在 SWI-prolog 中编写和尝试的内容如下:

better_attribute3_in(Attribute3_in,Attribute3):-
   atom_codes(Attribute3,List_Attribute3),
   startsWith(List_Attribute3,Attribute3_Start,Rest_Attribute3_List),
   atom_to_term(Rest_Attribute3_List,Attribute3_Number,_),
   number(Attribute3_Number),
   atom_codes(Attribute3_in,List_Attribute3_in),
   startsWith(List_Attribute3_in,Attribute3_in_Start,Rest_Attribute3_in_List),
   atom_to_term(Rest_Attribute3_in_List,Attribute3_in_Number,_),
   number(Attribute3_in_Number),
   Attribute3_in_Number>=Attribute3.

这在 SWI-Prolog 中运行良好,但是当我在 SICStus Prolog 中尝试它时,它似乎不起作用,无论如何要在 SICStus 中实现上层代码。

4

2 回答 2

1

我无法理解您的代码打算做什么,而且我认为它不能按原样工作。

  1. 比较不可能是正确的。
  2. atom_to_term/3 听起来像是将原子作为第一个参数,您的代码看起来像是传递了一个列表。
  3. 我不知道startsWith/3 做了什么,但我认为它类似于具有不同参数顺序的append/3。特别是我认为它可以成功不止一次。
  4. 我怀疑 better_attribute3_in(f22,f22)、better_attribute3_in(f12,f22) 和 better_attribute3_in(f22,f12) 都是真的。这是故意的吗?如果是这样,better_attribute3_in/2 应该是什么意思?

(要获得模仿原始代码的内容,您可能可以将startsWith(A,B,C)替换为append(B,C,A)并将atom_to_term(A,B,C)替换为name(A,B))。

于 2013-11-24T09:40:24.730 回答
0

我想通了,谢谢您的好意建议我将代码更改为:

better_attribute3_in(Attribute3_in,Attribute3):-
atom_codes(Attribute3,List_Attribute3),
startsWith(List_Attribute3,Attribute3_Start,
Rest_Attribute3_List),numeric(Rest_Attribute3_List),
number_codes(Attribute3_Number,Rest_Attribute3_List),
atom_codes(Attribute3_in,List_Attribute3_in),
startsWith(List_Attribute3_in,Attribute3_Start,Rest_Attribute3_in_List),
numeric(Rest_Attribute3_in_List),
number_codes(Attribute3_in_Number,Rest_Attribute3_in_List),
!,Attribute3_Number=<Attribute3_in_Number. 

使用 ascii 代码查看列表的内容是否代表数字:

numeric(List):-subset(List,[48,49,50,51,52,53,54,55,56,57]).

并使用startsWith来查看它们是否以相同的字符串开头(例如,我可以比较两个内存,但不能比较内存和硬盘):

startsWith(OldString,[],OldString):- true.
startsWith([H|TOldString],[H|T],Rest):-
startsWith(TOldString,T,Rest).
于 2013-11-24T18:12:16.963 回答