如何将使用atom_to_term的代码从SWI-prolog转换为SICStus Prolog

时间:2013-11-23 21:59:25

标签: prolog swi-prolog sicstus-prolog

我正在尝试编写一个规则来比较两个原子以查看哪个更好(例如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中实现上层代码。

2 个答案:

答案 0 :(得分: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应该是什么意思?
  5. (为了得到模仿原始代码的东西,你可以用append(B,C,A)替换startsWith(A,B,C)并用名称(A,B)替换atom_to_term(A,B,C) )。

答案 1 :(得分: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).