序言中的命题逻辑困难

Difficulty with propositional logic in prolog

我需要将以下命题转换为序言代码,但我不了解运算符的工作原理。我一般用java.

"牛仔裤只是休闲装,正装裤只是正式装,卡其裤是半正式装,腰带不是休闲装,黑袜什么时候都可以。 休闲 = C,半正式 = SF,正式 = F,牛仔裤 = J,正装裤 = DP,紧身裤 = K,腰带 = B,黑袜 = BS。 J -> C, DP -> F, K -> SF, B -> !C, BS -> (C v SF v F)"

这是我已有的代码:

casual(jeans).
formal(dress_pants, belt, black_socks).
semiFormal(khakis).
formal(belt).
semiFormal(belt).
casual(black_socks).
formal(black_socks).
semiFormal(black_socks).

非正式地,一元谓词 p 可以被视为集合 P,因此,文字 p(X) 可以被视为集合成员测试X∈P。因此,一个目标 p(X) 将是 truefalse (即一个命题),这取决于 X 是否属于集合P

句子“牛仔裤只是休闲装,正装裤只是正式装,卡其裤只是半正式装,腰带不是休闲装,黑袜子什么时候都可以。”可以是表示为集合:

  • 休闲 = {牛仔裤,black_socks}.
  • 正式 = {dress_pants,腰带,black_socks}
  • semi_formal = {卡其裤,腰带,black_socks}

这些集合可以用事实在 Prolog 中表示:

casual(jeans).
casual(black_socks).

formal(dress_pants).
formal(belt).
formal(black_socks).

semi_formal(khakis).
semi_formal(belt).
semi_formal(black_socks).

以下是关于这些事实的一些 Prolog 查询:

?- casual(jeans).
true.

?- casual(belt).
false.

?- casual(X).
X = jeans ;
X = black_socks.

?- formal(X).
X = dress_pants ;
X = belt ;
X = black_socks.

?- semi_formal(X).
X = khakis ;
X = belt ;
X = black_socks.