【问题标题】:Predicate in Prolog, predicate works only for numbersProlog中的谓词,谓词仅适用于数字
【发布时间】:2021-09-04 23:58:39
【问题描述】:

我在 Prolog 中编写谓词时遇到问题:

在 Prolog 中,定义一个谓词 replace1(L1, L2),当列表 L2 派生自列表 L1 时,该谓词通过将每个元素替换为 element * element 形式的元素来满足。

示例:L1 = [1, aa, 3], L2 = [1 * 1, aa * aa, 3 * 3].

我试过这种方式,但这个谓词只适用于数字:

replace1 ([], []) :- !.
replace1 ([X | Xs], [Z | Zs]) :-
  Z is X * X,
  replace1 (Xs, Zs).

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您正在使用 is/2 这是算术评估运算符。您可以使用= 并得到您想要的。

    replace([], []).
    replace([X|Xs], [Y|Ys]) :-
        Y = X * X,
        replace(Xs, Ys).
    

    这给出了:

    | ?- replace([1, aa, 3], X).
    X = [1*1,aa*aa,3*3]
    

    您也可以只在头部本身内使用模式匹配:

    replace([], []).
    replace([X|Xs], [X*X|Ys]) :-  replace(Xs, Ys).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多