首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swi-prolog真值赋值?

swi-prolog真值赋值?
EN

Stack Overflow用户
提问于 2015-04-09 06:24:08
回答 1查看 455关注 0票数 1

所以我有一个坚持不变的练习:

公式为:

tru

fls

变量(V)当且仅当V是原子。

or(Flist)当且仅当列表中的每个元素都是公式

有暗示,也有否定。表单看起来很相似。

我们可以用形式为Var1/Value1,Var2/Value2,...VarN/ValueN的Prolog列表来表示真值赋值(对变量的赋值)。写一个谓词sub(?F,? Asst,?G),当G是一个公式时,它是用赋值Asst中的相应值替换F的变量的结果。(你可以假设真值赋值A至少是部分实例化的)。

例如。

代码语言:javascript
复制
sub(variable(x), [x/tru], tru).
true
sub(or([variable(a),variable(b)]), [a/tru,b/fls], G).
G = or(tru,fls)
true

我试过了

代码语言:javascript
复制
sub(variable(x),[x/value],G):-
    G = variable(value).

但它只返回false。

编辑:对不起,我没有把问题说清楚,如果有一种方法可以将列表中与变量相关的值分配给另一个变量,有人能给我解释一下吗?我认为这与统一有关。

EN

回答 1

Stack Overflow用户

发布于 2015-04-09 08:34:23

变量是占位符。

注意区分大小写: Prolog变量名以大写字符或下划线开头,原子以小写字符开头。

您的sub/3代码片段假设键-值对列表的长度正好为 of one ([x/value])。通过使用member/2,列表可以具有任意长度。

在处理像and / or这样的n元逻辑连接符时,您可能需要一个尽快返回的短路实现。如下所示:

代码语言:javascript
复制
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)
    ).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29526410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档