0

たとえば、2つのアトムを比較してどちらが優れているかを確認するルールを作成しようとしています(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

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 を使用して、同じ文字列で始まるかどうかを確認します (たとえば、2 つのメモリを比較することはできますが、メモリとハードディスクを比較することはできません)。

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