所以我有一个坚持不变的练习:
公式为:
tru
fls
变量(V)当且仅当V是原子。
or(Flist)当且仅当列表中的每个元素都是公式
有暗示,也有否定。表单看起来很相似。
我们可以用形式为Var1/Value1,Var2/Value2,...VarN/ValueN的Prolog列表来表示真值赋值(对变量的赋值)。写一个谓词sub(?F,? Asst,?G),当G是一个公式时,它是用赋值Asst中的相应值替换F的变量的结果。(你可以假设真值赋值A至少是部分实例化的)。
例如。
sub(variable(x), [x/tru], tru).
true
sub(or([variable(a),variable(b)]), [a/tru,b/fls], G).
G = or(tru,fls)
true我试过了
sub(variable(x),[x/value],G):-
G = variable(value).但它只返回false。
编辑:对不起,我没有把问题说清楚,如果有一种方法可以将列表中与变量相关的值分配给另一个变量,有人能给我解释一下吗?我认为这与统一有关。
发布于 2015-04-09 08:34:23
变量是占位符。
注意区分大小写: Prolog变量名以大写字符或下划线开头,原子以小写字符开头。
您的sub/3代码片段假设键-值对列表的长度正好为 of one ([x/value])。通过使用member/2,列表可以具有任意长度。
在处理像and / or这样的n元逻辑连接符时,您可能需要一个尽快返回的短路实现。如下所示:
sub(tru,_,tru).
sub(fls,_,fls).
sub(variable(X),Assoc,Value) :-
member(X/Value,Assoc).
sub(or([]),_,fls).
sub(or([X|Xs]),Assoc,V) :-
sub(X,Assoc,T),
( T = tru, V = tru % short-circuit logical-or
; T = fls, sub(or(Xs),Assoc,V)
).https://stackoverflow.com/questions/29526410
复制相似问题