1

HI 私は次のように定義された単純な知識データベースを持っています。

carClass('X1','Oil','small').
carClass('X2','gas','big').
carClass('X3','Petrol','big').
carClass('X4','oil','small').
carClass('X5','Oil','small').
carClass('X6','gas','big').

クエリに答えるルールを作成しようとしています: 「オイル」で実行され、「ビッグ」ではないすべての carClass を表示します。

私はそれを使用して実装しようとしています:

OnOilButNotBig :-
   carClass(CarClass,'oil',_),
   carClass(CarClass,'oil', \+('big') ),
   write(CarClass).

しかし、これは機能していません。

4

2 に答える 2

1

まず最初に!

  • コードはコンパイルされません1。なんで?通常、述語名は小文字で始まります2

    OnOilButNotBig私のアドバイス:書く代わりにonOilButNotBig

  • 項の不等式を表現するには、次のように適切なゴールを使用します。

    onOilButNotBig :-
        dif(X, big) ,
       carClass(CarClass, オイル, _),
       carClass(カークラス、オイル、X)、
       書き込み(カークラス)。
    
  • 余談ですが、コードにはさらにいくつかの問題があります。

    1. 副作用ベースの I/O は、必要な場合にのみ使用してください。

      ほとんどの場合、データの入出力にはインタラクティブな

      onOilButNotBig (CarClass) :-
         dif(X, 大きい),
         carClass(CarClass, オイル, _),
         carClass(CarClass、oil、X)。
      
    2. 'oil'読みやすくするために、や などのアトムは使用しないでください'Oil'

      1つ選んでそれに固執してください!oilエスケープする必要のない (小文字)をお勧めします。

    3. 目標carClass(CarClass, oil, _)完全に冗長です。

      なんで?close-by goal の一般化です。carClass(CarClass,oil,X)


脚注 1: 8.1、 4.3.2、 7.3.14、および 3.6 を使用する場合。
脚注 2:権利 (一重引用符でエスケープ) が使用されている場合、名前は大文字で始める こともできます。
脚注 3:一般に、冗長なゴールは問題ありませんが、コードが意図したとおりに動作しない可能性が高いことを示唆しています。

于 2016-01-04T04:24:44.480 に答える