问题描述
我需要将以下命题转换为序言代码,但我不了解运算符的工作原理。我一般用java。
“牛仔裤只是休闲,正装裤只是正式,kakis只是半正式,腰带不休闲,黑色袜子任何时候都可以接受。 休闲 = C,半正式 = SF,正式 = F,牛仔裤 = J,正装裤 = DP,Kakis = 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)
将是 true 或 false(即命题),取决于 X 是否属于集合P 与否。
句子“牛仔裤只是休闲,正装裤只是正式,kakis只是半正式,腰带不休闲,黑色袜子随时可以接受。”可以表示为:
- 休闲 = {牛仔裤,black_socks}。
- 正式 = {dress_pants、腰带、black_socks}
- semi_formal = {卡其布、腰带、黑色袜子}
这些集合可以在 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.