【问题标题】:PROLOG predicate answers true or false, but not the desired valuePROLOG 谓词回答真或假,但不是所需的值
【发布时间】:2013-05-09 04:59:25
【问题描述】:

我是 Prolog 的新手,在尝试制作一个辅助函数时卡住了,该函数从列表中获取元素,一次 2 个,然后制作一个向量。 例如:

L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L). L = [0,1,3,0,0,0,0,0] .

应该是这样的,但我得到了这个:

?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L).
L = [0, 0, 0, 0, 0, 0, 0, 0] .

我的代码是:

 replace([_|T], 0, X, [X|T]).
 replace([H|T], I, X, [H|R]):- I > 0, I1 is I-1, replace(T, I1, X, R).

 v_form([],R).
 v_form([X,Y|Z],R) :- replace(R,X,Y,K), v_form(Z,K).

我发现这个“A 没有与规则主体中的任何内容统一。Prolog 的工作方式是通过术语统一。你不能像在程序语言中那样“返回”A”,所以我猜 R 在我的谓词没有统一,但如果是这样,我不明白为什么我得到想要的值,当我改变 v_form([],R). 为了 v_form([],R).:- write(R). 我明白了:

 ?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L).
 [0,1,3,0,0,0,0,0]
 L = [0, 0, 0, 0, 0, 0, 0, 0]

所以,如果我没有统一 R 是真的,为什么 wrtie(R) 不抛出错误/异常/打印 []/ 告诉我它没有统一,或者这些行中的什么,而是写我想要的 R谓词返回。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您正在“返回”K 而不是 R,并且必须添加另一个输出参数,因为在 Prolog 中您不能“重新分配”变量。这就是你引用的陈述的意思。

    试试

    v_form([],R,R).
    v_form([X,Y|Z],I,R) :- replace(I,X,Y,K), v_form(Z,K,R).
    
    ?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L,R).
    L = [0, 0, 0, 0, 0, 0, 0, 0],
    R = [0, 1, 3, 0, 0, 0, 0, 0] .
    

    【讨论】:

    • 谢谢,不知道“不能'重新分配'变量”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多